刚看到fibonacci用线性能快一个量级。
public class FibonacciLineSort { public static int fib(int n, int first, int next) { if (n < 2) { return n; } if (n == 2) { return first + next; } else { return fib(n - 1, next, first + next); } } public static void main(String[] args) { System.out.println(fib(8, 0, 1)); } }
对比原先的那种二分递归,上述算法的效率之所以如此低下,是因为其中有大量重复进行的递归调用⎯⎯只需画出该算法 的递归跟踪,即可验证这一结论。我们之所以会想到通过二分递归来解决这一问题,是因为被其外 表蒙骗了⎯⎯Fib(k)是由 Fib(k-1)和 Fib(k)决定的。然而实际上,Fibonacci 数的本质却是线性递归, 因此二分递归并不适用于这一问题。
1 long Fib(int n){ 2 return (2 > n) ? (long) n : Fib(n -1) + Fib(n - 2); 3 }
比较 Fibonacci 数的这两种算法可以看出,为了确保二分递归算法的效率,必须保证分解出来 的每对子问题之间是相互独立的,即它们各自的计算没有重复和冗余;即使不能彻底做到这样,也 应尽可能减少不必要的重复计算。
减少重复计算的一种直接而常用技巧,就是把子问题的计算结果记录下来,此后若再次遇到相 同的子问题,就可以根据记录直接获得结果,而不必重新计算⎯⎯实际上,这也就是动态规划 (Dynamic programming)的核心思想。