📜  递归斐波那契程序的时间复杂度(1)

📅  最后修改于: 2023-12-03 15:41:57.989000             🧑  作者: Mango

递归斐波那契程序的时间复杂度

什么是斐波那契数列

斐波那契数列是指:1、1、2、3、5、8、13、21、34、…。也就是数列的第一项和第二项均为1,从第三项开始,每一项均为其前两项之和。

递归斐波那契程序

以下是一个递归实现的斐波那契程序:

def fibonacci(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)
时间复杂度分析

我们通过递归树来分析递归斐波那契程序的时间复杂度。

以下是 n=5 时的递归树:fibonacci_recursion_tree

从递归树中可以看出,每一个节点都有两个子节点,因此递归树呈现出一种二叉树的形态。另外,从根节点到每一个叶子节点的路径长度都为 n,因此递归树的高度为 n。

我们考虑每一层递归所需的时间。每次递归都需要调用两次 fibonacci 函数,因此每一层的时间复杂度为 O(2^k)。其中,k 为层数。

因此,总的时间复杂度为:

$$ T(n)= O\left(2^0\right) + O\left(2^1\right) + O\left(2^2\right) + ... + O\left(2^{n-1}\right) = 2^n $$

因此,递归斐波那契程序的时间复杂度为 O(2^n),指数级别的复杂度,随着 n 的增加,时间复杂度呈指数增长。

改进

我们可以通过循环来避免递归带来的计算量。

以下是一个循环实现的斐波那契程序:

def fibonacci(n):
    if n < 0:
        return -1
    elif n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        a = 0
        b = 1
        for i in range(2, n+1):
            c = a + b
            a = b
            b = c
        return b

该方法的时间复杂度为 O(n),线性级别的复杂度,随着 n 的增加,时间复杂度呈线性增长。