斐波那契数列Fibonacci问题

斐波那契数列定义

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;
}

猜你喜欢

转载自www.cnblogs.com/evenleee/p/11961234.html