前言
一直以为斐波那契数列暴力递归的时间复杂度是
证明
紧界时间复杂度证明
斐波那契数列的计算过程很简单。就是简单的
我们把计算
这一式子可以进行变形。两边同时加 1,得到
记
明显这是一个斐波那契数列,只不过初项有所不同
但是注意,斐波那契数列的增长率与初项是无关的。证明如下:
设某斐波那契数列的前两项为
而
所以
所以
百度可以知道斐波那契数列
所以
量级时间复杂度证明
我们可以根据函数递归执行顺序画出下图的二叉树结构(假设求第五个斐波那契数)
graph TD
A(("F(5)")) --> B(("F(4)"))
A(("F(5)")) --> C(("F(3)"))
B(("F(4)")) --> D(("F(3)"))
B(("F(4)")) --> E(("F(2)"))
C(("F(3)")) --> F(("F(2)"))
C(("F(3)")) --> G(("F(1)"))
D(("F(3)")) --> H(("F(2)"))
D(("F(3)")) --> I(("F(1)"))
E(("F(2)")) --> J("X")
E(("F(2)")) --> K("X")
F(("F(2)")) --> L("X")
F(("F(2)")) --> M("X")
G(("F(1)")) --> N("X")
G(("F(1)")) --> O("X")
带X为将斐波那契数列二叉树补齐成满二叉树,根据这个二叉树,可以得出几个特征:
- 满二叉树层数为
,这里 ,所以有4层 - 满二叉树第h层(第1层为首层)个数为
- 满二叉树总结点数为
,这里 ,所以满二叉树结点为15 - 斐波那契数列二叉树总结点数为
,这里 ,斐波那契数列二叉树总结点数为9
所以这个时间复杂度就是