首页 > 其他 > 详细

斐波那契数列Fibonacci问题

时间:2019-11-30 10:06:25      阅读:69      评论:0      收藏:0      [点我收藏+]

斐波那契数列定义

Fibonacci array:1,1,2,3,5,8,13,21,34,...

在数学上,斐波那契数列是以递归的方法来定义:

  • F(0) = 0
  • F(1) = 1
  • F(n) = F(n-1) + F(n-2)

用文字描述,就是斐波那契数列由0和1开始,之后的斐波那契系数就是由之前的两数之和想加而得,首几个斐波那契数列系数是:0,1,1,2,3,5,8,13,21,34,55,...特别指出:0不是第一项,而是第零项。

递归解法

最容易想到的解法是按照公式的递归解法,具体实现如下:

int fib(int n) {
    if (n < 2) return n;
    return fib(n-1) + fib(n-2);
}

但其实该递归解法会重复两次计算 fib(n-2) 项,时间数量级远远超过 n,是指数级别的增长,时间复杂度很高,如下图所示,更因递归调用占用大量的堆栈空间,对程序而言是一种灾难。所以该种解法如果在面试中肯定是不能让面试官满意的。

 

技术分享图片

 顺序求和法

按照公式定义前开始的两项 a 和 b 为 0 和 1。后一项 c 是前两项之和,并且 a 和 b重新赋值,动态向右移动,时间复杂度为 O(n)。这种解法非常优秀!

int fib(int n)
{
    if (n < 2) return n;
    int a = 0;
    int b = 1;
    int c = 0;
    for (int i = 1; i < n; ++i) {
        c = a + b;
        a = b;
        b = c;
    }
    return c;
}

 

斐波那契数列Fibonacci问题

原文:https://www.cnblogs.com/evenleee/p/11961234.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!