斐波那契数列又因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”。
fibonacci 数列定义:
n = 1,2 时,fib(n) = 1
n > 2 时,fib(n) = fib(n-2) + fib(n-1)
此算法最大的优点是不存在重复计算,故效率比递归算法快的多得多。
下面简略比较一下递归与非递归之间的区别:
使用非递归算法求到第n(n>3)个月兔子的数量,是从第3个月开始,将前两个月兔子相加求当月的兔子的数量,并记录
前1个月兔子的数量,直到第n个月,用n-1个月和n-2个月兔子相加求出结果,这样的好处是,我们只计算了n次就求出了结
果,即时间复杂度为O(n);
用递归算法又会是什么结果呢?求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是说,为计算fib(n),必须先计算
fib(n-1)和fib(n-2),而计算fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。依次类推,直至计算fib(1)和fib(0),
分别能立即得到结果1和0。在递推阶段,必须要有终止递归的情况。例如在函数fib中,当n为1和0的情况。在回归阶段,当
获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解,例如得到fib(1)和fib(0)后,返回得到fib(2)的结果,……,
在得到了fib(n-1)和fib(n-2)的结果后,返回得到fib(n)的结果,时间复杂度为O(2n)(括号内为2的n次方).