Fibonacci数列的DP演算法java代码(暴力法、Top-down、Bottom-up)

Fibonacci数列的DP演算法(暴力法、Top-down、Bottom-up)

方法对比

  1. 暴力法:迭代
  2. Top-down:用数组记录之前求过的结果,省去大量重复计算
  3. Bottom-up:用for循环,从底部求到顶部
package leetcode_practise;

public class Fibonacci_DP {
    // 方法一:迭代暴力
    public static int fib_recursive(int N) {
        if (N == 1 || N == 2)
            return 1;
        else
            // 存在大量重复计算
            return fib_recursive(N - 1) + fib_recursive(N - 2);
    }

    // 方法二:Top-Down
    public static int fib_Top_Down(int N) {
        // 用数组记录已经求出的某个子问题的答案
        if (N < 1) return 0;
        // 备忘录全初始化为 0
        int[] r =new int[N+1];
//        for(int i=0;i<N+1;i++)
//        {
//            r[i]=0; //Integer.MIN_VALUE;//初始化数组r,
//        }
        return fib_Top_Down_helper(r, N);
    }

    public static int fib_Top_Down_helper(int[] r, int N) {
        // base case
        if (N == 1 || N == 2) return 1; // 已经计算过
        if (r[N] != 0) return r[N];
        r[N] = fib_Top_Down_helper(r, N - 1) + fib_Top_Down_helper(r, N - 2);
        return r[N];
    }

    // 方法三:Bottom-Up
    public static int fib_Bottom_Up(int N)
    {
        if (N == 2 || N == 1)
            return 1;
        int prev = 1, curr = 1;
        for (int i = 3; i <= N; i++) {
            int sum = prev + curr;
            prev = curr;
            curr = sum;
        }
        return curr;
    }

    // main 函数
    public static void main(String[] args) {
        System.out.println("方法一:递归 fib_recursive\n"+fib_recursive(7));
        System.out.println("方法二:自顶向下递归算法 fib_Top_Down\n"+fib_Top_Down(7));
        System.out.println("方法三:自底向上非递归算法 fib_Bottom_Up\n"+fib_Bottom_Up(7));
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laura_Wangzx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值