1978 Fibonacci数列 3
题目描述 Description
斐波纳契数列是这样的数列:
f1 = 1
f2 = 1
f3 = 2
f4 = 3
…
fn = fn-1 + fn-2
输入一个整数n
求fn
输入描述 Input Description
一个整数n, n<= 40
输出描述 Output Description
一个整数fn
样例输入 Sample Input
3
样例输出 Sample Output
2
递归实现
int F(int n)
if(n==1 || n==2) return 1;
else return F(n-1)+F(n-2);
}
递归树中的每一个子节点都会执行一次,很多重复的节点被执行,fib(2)被重复执行了5次。由于调用每一个函数的时候都要保留上下文,所以空间上开销会很大。这么多的子节点被重复执行,如果在执行的时候把执行过的子节点保存起来,后面要用到的时候直接查表调用的话可以节约大量的时间。
自底向上的动态规划
int F(int n){
if(n==1 || n==2) return 1;
int a[n+1];
a[1]=1;a[2]=1;
for(int i=3;i<=n;i++)
a[i]=a[i-1]+a[i-2];
return a[n];
}
采用这种算法比直接递归时间上快很多,特别是输入n值较大时非常明显。