斐波那契数列问题的两种解决方法

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........

这个数列从第3项开始,每一项都等于前两项之和。

简单来说,斐波那契数列可以用下面这个公式来表示。

      { 0   ,n=0
 f(n)={ 1   ,n=1
      { f(n-1)+f(n-2) ,n>1

关于斐波那契数列衍生的算法题层出不穷,比如青蛙跳台阶问题等(题目:一只青蛙一次可以跳1级台阶,也可以条2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。),斐波那契数列问题的解法主要有两种,下面来看一下。

1.效率极低的递归解法

   long fibonacci(int n){
        if (n==0){
            return 0;
        }
        if (n==1){
            return 1;
        }
        return fibonacci(n-1)+fibonacci(n-2);
    }

比如我们在求解f(10)时,需要先求f(9)和f(8)。同样,在求f(9)时,需要先求f(8)和f(7).....这种递归方法的时间复杂度是以 n 的指数的方式递增的,因为重复计算的节点数会随着 n 的增大而急剧增大。

2.把递归的算法用循环实现

   long fibonaccis(int n){
        if (n==0){
            return 0;
        }
        if (n==1){
            return 1;
        }
        int zero = 0;//f(0)
        int one = 1; //f(1)
        int sum = 0;
        for (int i = 2; i <= n; i++) {
            sum = one+zero; //f(n)=f(n-1)+f(n-2)
            zero = one;
            one = sum;
        }
        return sum;
    }

我们可以把已经得到的数列中间项保存起来,在下次需要计算的时候我们先查找一下,如果前面已经计算过就不用再重复计算了。

这个算法的流程是:

f(2)=f(1)+f(0)
f(3)=f(2)+f(1)
f(4)=f(3)+f(2)
...

3.解法比较

用不同的方法求解斐波那契数列的时间效率大不相同。第一种基于递归的解法虽然直观但时间效率很低,在实际软件开发中不会用这种方法,也不可能得到面试官的青睐。第二种方法把递归的算法用循环实现,极大地提高了时间效率。

原文地址:https://www.cnblogs.com/yueshutong/p/10336217.html

时间: 2024-11-08 21:10:21

斐波那契数列问题的两种解决方法的相关文章

求斐波那契数列的相邻两项的比值,精确到小数后三位。

未完成,只能假设知道是9和10代入. 代码如下: package zuoye; import java.math.BigDecimal; /* * 求斐波那契数列的相邻两项的比值,精确到小数后三位. * p1,p2,p3......pi,pj,...求pi/pj * 1 1 2 3 5 8 13 * 5/8,8/13,...收敛 */ public class Test { static double feibo(int x){ if(x==1||x==2) return 1; return f

斐波那契数列递归内存溢出如何解决

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........某一项是前两项的和.使用递归调用时前四十项求解没有问题,但到底五十项的时候会出现内存溢出,求不出结果.所以要想求出更多的项必须使用非递归的方法求解,数据类型不能再是int,可以为double. 1.内存溢出的实例 package test.only

hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速幂来解,不用说肯定wa,看题目的通过率也不高,我想会不会有啥坑啊.然而我就是那大坑,哈哈. 不说了,直接说题吧,先讨论k=1,2,3;时的解.这应该会解吧,不多说了: 从第四项开始f(4)=a^1+b^2;f(5)=a^2+b^3;f(6)=a^3+b^5......; 看出来了吧,a上的指数成斐波

斐波那契数列——摘自搜狗百科

1数列公式 递推公式 斐波那契数列:0.1.1.2.3.5.8.13.21.34.55.89.144... 如果设F(n)为该数列的第n项(n∈N*),那么这句话可以写成如下形式: F(0) = 0,F(1)=F(2)=1,F(n)=F(n-1)+F(n-2) (n≥3) 通项公式 通项公式的推导方法一:利用特征方程 线性递推数列的特征方程为: X^2=X+1 解得 X1=(1+√5)/2, X2=(1-√5)/2. 斐波拉契数列则F(n)=C1*X1^n + C2*X2^n ∵F(1)=F(2

斐波那契数列尾数循环

尾数循环 斐波那契数列的个位数:一个60步的循环 11235,83145,94370,77415,61785.38190, 99875,27965,16730,33695,49325,72910- 进一步,斐波那契数列的最后两位数是一个300步的循环,最后三位数是一个1500步的循环,最后四位数是一个15000步的循环,最后五位数是一个150000步的循环. 验证尾数循环 #include<stdio.h> int main() { long long int f1 = 1, f2 = 1;

斐波拉契数列的一些性质

\(fib[1]=1,fib[2]=1,fib[n]=fib[n-1]+fib[n-2](n>=3)\) \(h[1]=a,h[2]=b,h[n]=b*fib[n-1]+a*fib[n-2](n>=3)\) \(h[n]=h[n-1]+h[n-2]\) \(h[n]=h[n-2]+h[n-3]+h[n-2]\) \(h[n]=h[n-4]+h[n-4]+h[n-3]+h[n-2]\) \(h[n]=\sum_{i=1}^{n-2}h[i] + h[2]\) \(\sum_{i=1}^{n}h[

C++算法之 斐波那契数列

题目:写一个函数,输入n,求斐波那契数列的第n项. 方法1:递归: int fib2(int n) { if(n == 0) return 0; if(n == 1) return 1; return fib2(n-1)+fib2(n-2); } 缺点:如果n比较大,那么递归程度比较深 方法2: int fib(int n) { int result[2] = {0,1}; if(n < 2) return result[n]; int fibOne = 0; int fibTwo = 1; i

【c语言】求斐波那契数列的前40个数。特点,第1,2个数为1,从第三个数开始,该数是前面两个数之和

// 求斐波那契数列的前40个数.特点,第1,2个数为1,从第三个数开始,该数是前面两个数之和 #include <stdio.h> int main() { int a = 1; int b = 1; int c,i; printf("%d\t%d\t",a,b); for(i = 3; i <= 40; i++) { c = a + b; printf("%d\t",c); a = b; b = c; } printf("\n&quo

Python 两种方式实现斐波那契数列

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368...... 这个数列从第3项开始,每一项都等于前两项之和. 递归的方式实现: def fn(n): if n==1: return 1 elif n==2: return 1 else: return fn(n-1)+fn(n-2) n=int(input())