TL;DR:
暴力递归求解斐波那契数列的时间复杂度的紧界不是
本文将给出几个简洁证明
用最暴力的方法求解斐波那契数列,时间复杂度是多少?具体地说,就是求下面这个程序的复杂度:
def fib(n):
if n <= 1:
return 1
return fib(n - 1) + fib(n - 2)
答案是
但是经过一些朋友的提醒,我发现我的证明方法实在是太笨了,其实还有很多很符合直观的简洁证明方法。所以我把我现在已知的一些简洁证法记录在这里。
方法一(感谢 @王景隆 )
斐波那契数列的计算过程很简单。就是简单的
我们把计算
这一式子可以进行变形。两边同时加 1,得到
我们记
这是一个斐波那契数列,只不过初项有所不同。
但是斐波那契数列的增长率与初项无关。证明如下:
设某斐波那契数列的前两项为
那么显然,以
其中每个元素都是以
因此,可知
网上可以查到斐波那契数列的通项公式,这等价于
证明二(感谢某热心群友)
这是一个更加直观的证明方法。
斐波那契数列的递归计算方法过程中,存在两种递归结点:
- 第一种,叶子结点,
会直接返回结果,记直接返回所需时间为
- 第二种,内部结点,
时,
对
与
的结果进行相加,记加法与返回结果所需的所有时间为
而递归求解斐波那契数列的叶子结点数量其实就是
而内部结点的数量其实就是
因此,一共所需要的时间为
在此谢谢所有提出意见,给我启发的朋友们!