📅  最后修改于: 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 时的递归树:
从递归树中可以看出,每一个节点都有两个子节点,因此递归树呈现出一种二叉树的形态。另外,从根节点到每一个叶子节点的路径长度都为 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 的增加,时间复杂度呈线性增长。