斐波那契的线性排序

刚看到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)的核心思想。

posted @ 2019-12-13 11:26  zhangyu63  阅读(373)  评论(0编辑  收藏  举报