爬臺階問題(遞迴和動態規劃實現)
問題描述: 一個人爬樓梯,每次只能爬1個或2個臺階,假設有n個臺階,那麼這個人有多少種不同的爬樓梯方法?
這個問題可以分解成兩個子問題(當n>=2時),最後一步是爬1個臺階還是爬兩個臺階(兩種情況),當爬1個臺階的時候:問題就分解成,最後爬一個臺階,前面n-1個臺階有 多少種爬法?當最後爬2個臺階的時候,前面n-2個臺階有多少種爬法?然後兩個子問題方法相加就是會後結果。兩個子問題又可以再分割成更小的子問題。。。最後的結果是 到n==1這種基礎情況。(符合遞迴的條件),下面給出遞迴和動態規劃的java程式碼:
import java.util.Scanner;
public class ClimbStairs
{
/**
* 使用樸素遞迴的方法和動態規劃的方法實現求爬樓梯的方法數
*/
public static void main(String[] args)
{
long start1, start2;//用於記錄兩個子函式開始執行的時間
Scanner str = new Scanner(System.in);
int number = str.nextInt();//獲得臺階數目
long count[] = new long[number + 1];//用於記錄動態規劃中子問題的解
count[0] = 1L;
count[1] = 1L;
start1 = System.currentTimeMillis();//記錄函式1的開始時間
System.out.println("There are " + fun1(number) + " methods.");
System.out.println("Cost " + (System.currentTimeMillis() - start1) + " ms.");//獲得函式1的執行時間
start2 = System.currentTimeMillis();//記錄函式2的開始時間
System.out.println("There are " + fun2(count, number) + " methods.");
System.out.println("Cost " + (System.currentTimeMillis() - start2) + " ms.");//獲得函式2的執行時間
}
//定義樸素遞迴呼叫方法
public static long fun1(int num)
{
if (num == 1)//基礎情況
return 1L;
else if (num == 2)//基礎情況
return 2L;
else
return fun1(num - 1) + fun1(num - 2);//遞迴呼叫
}
//定義動態規劃方法
public static long fun2(long count[], int num)
{
if (num == 1)//基礎情況
return 1L;
else
{
for (int i = 2; i <= num; i++)
{
count[i] = count[i - 1] + count[i - 2];//這裡並沒有呼叫原函式計算,而是直接使用子問題的結果
}
}
return count[num];
}
}
There are 1836311903 methods.
Cost 4848 ms.
There are 1836311903 methods.
Cost 1 ms.
上面的結果也證實了動態規劃的效率要遠遠高於樸素遞迴的方法(這種方法不記錄前面的計算結果,每次用到的時候都重新計算)。相關文章
- python-動態規劃的遞迴、非遞迴實現Python動態規劃遞迴
- 動態規劃6:臺階問題和矩陣最小路徑問題動態規劃矩陣
- 演算法基礎--遞迴和動態規劃演算法遞迴動態規劃
- 一文學懂遞迴和動態規劃遞迴動態規劃
- 動態規劃9:變態跳臺問題動態規劃
- 【動態規劃】0-1揹包問題原理和實現動態規劃
- 迴文串問題(動態規劃DP C++)動態規劃C++
- 看動畫輕鬆理解「遞迴」與「動態規劃」動畫遞迴動態規劃
- 原:八皇后問題的遞迴和非遞迴Java實現遞迴Java
- 遞迴、迭代和動態規劃:以九宮格鍵盤為例遞迴動態規劃
- 詳解動態規劃01揹包問題--JavaScript實現動態規劃JavaScript
- 詳解動態規劃01揹包問題–JavaScript實現動態規劃JavaScript
- 動態規劃之子序列問題動態規劃
- 揹包問題----動態規劃動態規劃
- 【動態規劃】揹包問題動態規劃
- 整數劃分問題(動態規劃)動態規劃
- 遞迴實現漢諾塔問題遞迴
- 遞迴和非遞迴分別實現求n的階乘遞迴
- 最小總和問題(動態規劃演算法)動態規劃演算法
- 動態規劃 01揹包問題動態規劃
- 找零問題與動態規劃動態規劃
- 【動態規劃】01揹包問題動態規劃
- 動態規劃-01揹包問題動態規劃
- 動態規劃,股票問題留坑動態規劃
- 動態規劃篇——揹包問題動態規劃
- 醜數問題——動態規劃、Java動態規劃Java
- (動態規劃)最小分糖果問題動態規劃
- 動態規劃--01揹包問題動態規劃
- 詳解動態規劃最少硬幣找零問題–JavaScript實現動態規劃JavaScript
- 詳解動態規劃最少硬幣找零問題--JavaScript實現動態規劃JavaScript
- 動態規劃---例題3.最大子段和問題動態規劃
- 回溯和遞迴實現迷宮問題(C語言)遞迴C語言
- 應用動態規劃思想解決實際問題動態規劃
- 動態規劃-揹包01問題推理與實踐動態規劃
- 【動態規劃】01揹包問題【續】動態規劃
- 動態規劃5:找零錢問題動態規劃
- 好題——動態規劃動態規劃
- 動態規劃專題動態規劃