美文网首页
P12-斐波那契数列-去重递归/双指针迭代

P12-斐波那契数列-去重递归/双指针迭代

作者: YonchanLew | 来源:发表于2021-05-11 11:37 被阅读0次
//斐波那契数列
/*
* 取第N位的值(0开始,8是第6位),0,1,1,2,3,5,8....
* */
public class P12 {
    public static void main(String[] args) {
        System.out.println(calculate(7));
        System.out.println(calculate2(7));
        System.out.println(iterate(7));
    }

    //1、最常见的是暴力递归
    public static int calculate(int num){
        if(num == 0){
            return 0;
        }
        if(num == 1){
            return 1;
        }

        return calculate(num-1) + calculate(num-2);
    }

    //2、去重递归,时间、空间都是 O(n)
    // 上面的方法要计算calculate(num-1) 和 calculate(num-2)
    // 出现重复计算的问题,例如calculate(9) + calculate(8),8会在9的分支上计算,所有右侧分支根本没必要计算
    public static int calculate2(int num){
        int[] arr = new int[num+1];
        return recurse(arr, num);
    }
    private static int recurse(int[] arr, int num){
        if(num == 0){
            return 0;
        }
        if(num == 1){
            return 1;
        }

        //num刚好可以作为数组下标
        if(arr[num] != 0){      //代表该下标已经有值,
            return arr[num];    //不需要再递归了
        }
        arr[num] = recurse(arr, num-1) + recurse(arr, num-2);
        return arr[num];
    }

    //3、双指针算法
    // 上方的方法是用数组存起每个值,但这些值用完之后就没用的了
    // 只需要3个空间,两个指针+一个sum,每次计算完都赋值为下一个数
    /*
    * 0 1 1 2 3 5 8
    * ↑ ↑ s
    *   ↑ ↑ s
    * */
    private static int iterate(int num){
        if(num == 0){
            return 0;
        }
        if(num == 1){
            return 1;
        }

        int low = 0;
        int high = 1;
        for(int i=2; i<=num; i++){
            int sum = low+high;
            low = high;
            high = sum;
        }

        return high;
    }
}

相关文章

网友评论

      本文标题:P12-斐波那契数列-去重递归/双指针迭代

      本文链接:https://www.haomeiwen.com/subject/lptbdltx.html