递归优化

问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法?

标准代码

    public static int f(int n) {
        if (n <= 2) {
            return n;
        }else{
              return f(n - 1) + f(n - 2);
        }
    }

重复计算太多

优化代码

    int[] arr = new int[1000];
    public int f(int n) {
        if (n <= 2) {
            return n;
        } else {
            if (arr[n] != 0) {
                return arr[n];//已经计算过,直接返回
            } else {
                arr[n] = f(n-1) + f(n-2);
                return arr[n];
            }
        }
    }

对于递归的问题,我们一般都是从上往下递归的,直到递归到最底,再一层一层着把值返回。

不过,有时候当n比较大的时候,例如当n = 10000时,那么必须要往下递归10000层直到n <=2才将结果慢慢返回,如果n太大的话,可能栈空间会不够用。

对于这种情况,其实我们是可以考虑自底向上的做法的。例如我知道:

  • f(1)=1;

  • f(2)=2。

那么我们就可以推出f(3)= f(2)+f(1)=3。从而可以推出f(4),f(5)等直到f(n)。

因此,我们可以考虑使用自底向上的方法来做。

    public static int f2(int n) {
        if (n <= 2) {
            return n;
        }
        int f1 = 1;
        int f2 = 2;
        int sum = 0;
        for (int i = 0; i <= n; i++) {
            sum = f1 + f2;
            f1 = f2;
            f2 = sum;
        }
        return sum;
    }

 

posted @ 2018-12-13 16:09  gallenlee978  阅读(132)  评论(0)    收藏  举报