遞歸、動態規劃(用數組)、迭代(不用數組)三種方式JAVA實現。樓梯有n階臺階,上樓可以一步上1階,2階,3階,編程序計算共有多少種不同的走法?

樓梯有n階臺階,上樓可以一步上1階,2階,3階,編程序計算共有多少種不同的走法?

  • 遞歸

  • 動態規劃(用數組)

  • 迭代(不用數組)

/**
 * @ClassName testClimbLadders
 * @Description //有n階臺階,上樓可以一步上1階,2階,3階,編程序計算共有多少種不同的走法;
 *                遞歸、動態規劃(用數組)、迭代(不用數組)實現
 * @Author
 * @Date 2019-11-19 20:23
 * @Version 1.0
 **/
public class testClimbLadders {
    public static void main(String[] args) {
        int mm = 40;
        long time1 = System.currentTimeMillis();
        System.out.println(countWays1(mm));
        long time2 = System.currentTimeMillis();
        System.out.println("遞歸方式耗時"+(time2-time1)+"ms");

        long time3 = System.currentTimeMillis();
        System.out.println(countWays2(mm));
        long time4 = System.currentTimeMillis();
        System.out.println("遞歸方式耗時"+(time4-time3)+"ms");

        long time5 = System.currentTimeMillis();
        System.out.println(countWays3(mm));
        long time6 = System.currentTimeMillis();
        System.out.println("遞歸方式耗時"+(time6-time5)+"ms");
    }

    /**
     * 遞歸方法
     * @param n
     * @return
     */
    private static long countWays1(int n){
        if(n <= 0){
            return 0;
        }else if(n == 1){
            return 1;
        }else if(n == 2){
            return 2;
        }else if(n == 3){
            return 4;
        }else {
            return countWays1(n-1) + countWays1( n-2)+countWays1(n-3);
        }
    }

    /**
     * 動態規劃法 (利用數組來存儲);當一個問題可以分解成若干重複的子問題時,運用動態規劃的思想;
     * 子問題的中間計算結果保存,避免每次遞歸去重複計算
     * @param n
     * @return
     */
    private static long countWays2(int n){
        long[] arr = new long[n+1];
        arr[0] = 0;
        arr[1] = 1;
        arr[2] = 2;
        arr[3] = 4;
        for(int i =4;i<=n;i++){
            arr[i] = arr[i-1] +arr[i-2] +arr[i-3];
        }
        return arr[n];
    }

    /**
     * 不使用數組保存中間結果,降低空間複雜度
     * @param n
     * @return
     */
    private static long countWays3(int n){
        long num1 = 1;
        long num2 = 2;
        long num3 = 4;
        for(int i=4; i<=n; i ++){
            //通過變量交換的形式實現,f(n)=f(n-1)+f(n-2)+f(n-3)狀態轉移方程
            long tmp = num3 + num2 +num1;
            long tmp1 = num3;
            long tmp2 = num2;
            num3 = tmp;
            num2 = tmp1;
            num1 =tmp2;
        }
        return num3;
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章