问题:
Fibonacci 为 1200 年代 的 欧洲 数学家, 在 他 的 著作 中 曾经 提到: "若有 一只 免 子 每个月
生 一只 小 免 子, 一个月 后 小 免 子 也 开始 生产. 起初 只有 一只 免 子, 一个月 后 就有 两只
免 子, 二个月 后 有 三 只 免 子, 三个月 后 有 五 只 免 子 (小 免 子 投入 生产 )......"。
如果 不太 理解 这个 例子 的 话, 举 个 图 就 知道 了, 注意 新生 的 小 免 子 需 一个月 成长期
才会 投入 生产, 类似 的 道理 也 可以 用于 植物 的 生长, 这 就是 数 列 Fibonacci, 一般 习惯
称之 为 费 氏 数 列, 例如 以下:
1,1, 2,3,5,8,13,21,34,55,89 ......
思路:
以上数字有如下规律,
当n>2时,f(n)=f(n-1)+f(n-2)
当n<2时,f(n)=1
其中,n为兔子数目,n>=1
代码:
递归算法代码:
int f(n){
if (n <= 2 )
return 1 ;
else return (f(n - 1 ) + f(n - 2 ));
}
算法简单,但是效率极差.因为已经计算过的值他会重复计算.比如f(3)计算过,如果我现在计算f(5),我需要f(3)的值,递归算法要在此计算f(3)
下面这个方法以空间换时间,就是预先定义一个较大的数组,存储各个f(n)的值
#include < stdio.h >
#include < stdlib.h >
#define N 20
int main( void ) {
int fib[N] = { 0 };
int i;
fib[ 1 ] = 0 ;
fib[ 2 ] = 1 ;
for (i = 3 ; i <= N; i ++ )
fib[i] = fib[i - 1 ] + fib[i - 2 ];
for (i = 1 ; i <= N; i ++ )
printf( " %d " , fib[i]);
printf( " \n " );
return 0 ;
}
也可以通过通项公式计算: