wang-编程日记四:
青蛙跳台阶问题(斐波拉契蛾数列应用)
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,请问这只青蛙跳上n级台阶总共有多少种跳法?
解法一://递归
青蛙只有两种跳法要么跳一级要么跳两级,如果从第n次开始回溯这思考,(n有两种可能n-1或n-2,n-1有两种可能n-2或n-3,n-2有两种可能n-3或n-4)。
所以从第一次开始思考(假设台阶大于2,那么3有两种可能1或2,4有两种可能3或2,··)发现规律当前台阶数可能跳法=台阶数-1可能跳法+台阶数-2可能跳法(f(n) = f(n - 1)+f(n -2))递归实现还是比较简单的。
代码:
int fun(int n ){
if (n == 2)
return 2;
else if (n == 1)
return 1;
else if (n == 0)
return 0;
return fun(n - 1) + fun(n - 2);
}
解法2://动态规划(意思可以百度)
5
4 3
3 2 2 1
2 1
在解法1中会发现假设n=5,那么他要计算重复的两次n = 3,如果n的次数增大则重复计算的次数也越多,所以如果把计算过的n存在数组中,每次计算直接利用访问数组那么计算速度就会优化非常多
代码:
int climbStairs(int n) {
vector<int> memory(n+1,-1);
memory[0] = 0;
memory[1] = 1;
memory[2] = 2;
for (int i = 3; i <= n; i++)
memory[i] = memory[i - 1] + memory[i - 2];
return memory[n];
}