关于斐波拉契数列所引伸出来的问题
Posted TangguTae
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于斐波拉契数列所引伸出来的问题相关的知识,希望对你有一定的参考价值。
1、斐波拉契数列
之前有讲过关于斐波拉契数列相关的知识,参考这篇文章
求解一个数变为斐波拉契数需要多少步(C语言)_TangguTae的博客-CSDN博客
求斐波拉契数列的第n项有三种方法来实现:递归法、迭代法、利用数学公式。
递归法
long long Fibonacci(int n)
if (n <= 0)
return 0;
if (n == 1)
return 1;
return Fibonacci(n - 1) + Fibonacci(n - 2);
迭代法
利用斐波拉契数列递推公式f(n) = f(n-1) + f(n-2)
int Fibonacci(int n)
if(n==1 || n==2)
return 1;
int f1 = 1, f2 = 1;
int fn=0;
for(int i = 2; i<n; i++)
fn = f1+f2;
f1=f2;
f2=fn;
return fn;
利用数学公式的方法求解
这个比较难想到,有兴趣可以去看看剑指offer这本书上的面试题9
2、跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
看似这题很复杂,要统计所有的情况正着想也太复杂了。但是我们可以换个角度思考,假设现在青蛙已经在第n级台阶上,如果我们每次只能下一级台阶或者两级台阶,下一级台阶则只需要在讨论剩下n-1级台阶该如何下,如果下两级台阶则考虑剩下n-2级台阶该如何下,所以我们可以得到f(n) = f(n-1) + f(n-2)这样的递推式,是不是感觉很眼熟,就是斐波拉契数列。
这种问题也属于动态规划,可以用动态规划的通用方法来解决,不过这题只需要三个变量即可,不需要整个数组。
代码就参考上面的斐波拉契的代码即可。
3、跳台阶的变形
将上题题目更改,青蛙现在的选择更多了,每次可以跳[1,n]当中任意级台阶,总共有多少种跳法?
跳台阶扩展问题_牛客题霸_牛客网 (nowcoder.com)
同样的反着想,每次可以下1级到n级,那么递推式f(n) = f(n-1) + f(n-2) + ...+ f(1) + 1。+1是代表当下一跳跳n级台阶的情况。
利用动态规划
int jumpFloorII(int number)
int dp[21]=0;
dp[0] = 1;
for(int i =1; i < number; i++)
for(int j = i;j>0;j--)
dp[i] += dp[j-1];
dp[i]+=1;
return dp[number - 1];
以上是关于关于斐波拉契数列所引伸出来的问题的主要内容,如果未能解决你的问题,请参考以下文章