问题陈述:
Fibonacci为1200年代的欧洲数学家,在他的著作中曾经提到:若有一只兔子每个月生一只小兔子,一个月后小兔子也开始生产。起始只有一只兔子,一个月后就有两只兔子,二个月后有三只兔子,三个月后有五只兔子(小兔投入生产)......。这就是Fibonacci数列,一般习惯称之为费氏数列,例如如下: 1 1 2 3 5 8 13 21 34 55 89.....
问题解法:
根据问题陈述,我们可以将费氏数列定义为一下:
F(n) = F(n-1) + F(n-2) if n > 1
F(n) = 1 if n = 0, 1
Fibonacci有两种最常见的解法,即迭代法和递归法。
代码详解:
1 /* 2 注:fibanacci数列下标从0开始 3 fibRecurse(int n) 递归计算数列下标为n的值 4 fibIterate(int n) 迭代计算数列下标为n的值 5 */ 6 #include <stdio.h> 7 #include <stdlib.h> 8 9 int fibRecurse(int n); 10 int fibIterate(int n); 11 12 int main() 13 { 14 int i, n; 15 printf("Please input a number : "); 16 scanf("%d", &n); 17 printf("Recursion: "); 18 for(i=0; i<n; i++) { 19 printf("%-5d",fibRecurse(i)); 20 if((i+1)%10 == 0) { 21 printf(" "); 22 } 23 } 24 printf(" "); 25 printf("Iteration: "); 26 for(i=0; i<n; i++) { 27 printf("%-5d",fibIterate(i)); 28 if((i+1)%10 == 0) { 29 printf(" "); 30 } 31 } 32 return 0; 33 } 34 35 int fibRecurse(int n) { 36 if(n < 0) { 37 return -1; 38 } 39 if(n==0 || n==1) { 40 return 1; 41 }else { 42 return fibRecurse(n-1) + fibRecurse(n-2); 43 } 44 } 45 46 int fibIterate(int n) { 47 int a = 1, b = 1, i, s; 48 if(n < 0) { 49 return -1; 50 } 51 if(n==0 || n==1) { 52 return 1; 53 }else { 54 for(i=1; i<n; i++) { 55 s = a+b; 56 a = b; 57 b = s; 58 } 59 } 60 return s; 61 }