关于斐波拉契数列所引伸出来的问题

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 级的台阶总共有多少种跳法。

跳台阶_牛客题霸_牛客网 (nowcoder.com)

看似这题很复杂,要统计所有的情况正着想也太复杂了。但是我们可以换个角度思考,假设现在青蛙已经在第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];
    

以上是关于关于斐波拉契数列所引伸出来的问题的主要内容,如果未能解决你的问题,请参考以下文章

动态规划专题1:斐波拉契数列问题的递归和动态规划

剑指offer-斐波那契数列

7,菲波拉契数

Python 探讨斐波拉契数列模素数的周期问题

《剑指offer》------斐波拉契数列

斐波拉契数列的代码书写和分析