斐波那契数列又因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”。
fibonacci 数列定义:
n = 1,2 时,fib(n) = 1
n > 2 时,fib(n) = fib(n-2) + fib(n-1)
public class FibTest { public static void main(String[] arags){ long begin = System.currentTimeMillis(); System.out.println(fib(10)); long end = System.currentTimeMillis(); System.out.println(end – begin); } public static long fib(int n){ if(n < 3) return 1; else{ long a = 1; long b = 1; for(int i = 2 ; i < n-1 ;i++){ b = a + b; a = b – a; System.out.println(“a = “+a +” b = “+b); } return a + b; } } }
此算法最大的优点是不存在重复计算,故效率比递归算法快的多得多。
下面简略比较一下递归与非递归之间的区别:
使用非递归算法求到第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次方).