求斐波那契数,你还在用递归吗?

2020-11-12  本文已影响0人  丰极

1、什么是斐波那契数?

    F(0) = 0,  
    F(1) = 1
    F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
    给定 N,计算 F(N)。

2、经典解法-递归

根据题意,我们可以用递归求解。

    public int fib(int N) {
        if (N < 2) {
            return N;
        }
        return fib(N-1) + fib(N-2);
    }

但是这个是最好的解法吗?

发现什么问题没?

那有没有其它的好办法呢?

3、动态规划

我们尝试从小往大推演,把计算结果保存下来,避免重复计算,这种方法一般称之为动态规划。

    public int fib(int N) {
        if (N < 2) {
            return N;
        }
        int[] cache = new int[N+1];
        cache[0] = 0;
        cache[1] = 1;
        for (int i = 2; i <= N; i++) {
            cache[i] = cache[i-1] + cache[i-2];
        }
        return cache[N];
    }

4、动态规划改进

    public int fib(int N) {
        if (N < 2) {
            return N;
        }
        int m = 0, n = 1;
        for (int i = 2; i <= N; i++) {
            int o = n + m;
            m = n;
            n = o;
        }
        return n;
    }

关注公众号:丰极,了解更多算法知识。

上一篇下一篇

猜你喜欢

热点阅读