N級台階走法 演算法問題

2021-10-22 08:38:28 字數 1754 閱讀 3143

題目: 總共100級台階(任意n級都行),小明每次可選擇走1步、2步,問走完這100級台階總共有多少種走法?

分析:對於台階走法

假設只有乙個台階,那麼只有一種跳法,那就是一次跳一級,f(1)=1;如果有兩個台階,那麼有兩種跳法,第一種跳法是一次跳一級,第二種跳法是一次跳兩級, 如果有大於2級的n級台階,那麼假如第一次跳一級台階,剩下還有n-1級台階,有f(n-1)種跳法,假如第一次條2級台階,剩下n-2級台階,有f(n-2)種跳法。

​ 只有1階時,有f(1) -> 1;

​ 2階時,有f(2) -> 2 種走法;

​ 3階時,有f(3) = f(1) + f(2) 種走法;

​ n階時,有f(n) = f(n-1) + f(n-2) 種走法;

可知為斐波那契數列。對於**實現,可以通過遞迴思想來實現;

//走台階的基礎走法onestep_lv0()方法

private

static

long

onestep_lv0

(long stpes)

if(stpes ==1)

if(stpes ==2)

return

onestep_lv0

(stpes-1)

+onestep_lv0

(stpes-2)

;}//呼叫 onestep_lv0()方法

private

static

void

doanswer

(int stpes)

既然計算f(100) 必須要 計算 f(98)+f(99),那麼意味著,我其實計算f(n)時,需要將之前的 n-1種情況都計算了,那麼我們可以由低階往高階計算,並將每次結果儲存起來,優化**如下:

private

static

void

doanswer

(int stpes)

system.out.

print

(answerarr[stpes]);

}//走台階的基礎走法onestep_lv1()方法

private

static

long

onestep_lv1

(int stpes,

long

answerarr)

if(stpes ==1)

if(stpes ==2)

return

onestep

(stpes-

1,answerarr)

+onestep

(stpes-

2,answerarr)

;}

改進後計算時間將大大減少。

注意由於100階的結果是 573147844013817084101 會溢位 long 的最大長度,所以需要將結果換為bigdecimal,在此省略改造**。

衍生:動態規劃原理

subteties(重疊子問題):在問題的求解過程中,很多子問題的解將被多次使用。

動態規劃演算法的設計步驟:

動態規劃特點:

通俗點,動態規劃是把乙個大問題拆解成一堆小問題,這個本身沒啥問題,但是這個不是動態規劃的核心思想,或者說,乙個」大問題「之所以能用」動態規劃「解決,並不是因為它能拆解成一堆小問題,因為任何大問題都能拆解成小問題.

取決於該問題是否能用動態規劃解決的是這些」小問題「會不會被被重複呼叫

Python實現N階台階的走法問題

題目 一棟樓有n階樓梯,兔子每次可以跳1 2或3階,問一共有多少種走法?afanty的分析 遇到這種求規律的問題,自己動動手推推就好,1階有幾種走法?2階有幾種走法?3階有幾種走法?4階有幾種走法?5階有幾種走法?對吧,規律出來了!易錯點 這不是組合問題,因為第1次走1階 第2次走2階 不同於第1次...

蹬N級階梯有幾種走法

今天蹲大的時候,想著這道題,逆向想通了,記下來。題目 有n級階梯,往上走的時候,有兩種走法 走1級或走2級。問,蹬上n級階梯,總共有多少總解法。正向想很容易陷進去前面走的是否有重複 交叉一類的思維陷阱中。逆向就好想了 我們先假設 n級階梯總共有k n 中解法。人在走最後一步的時候,只有兩種解法 走一...

遞迴 上台階走法

遞迴需要滿足的三個條件剛剛這個例子是非常典型的遞迴,那究竟什麼樣的問題可以用遞迴來解決呢?我總結了三個條件,只要同時滿足以下三個條件,就可以用遞迴來解決。乙個問題的解可以分解為幾個子問題的解何為子問題?子問題就是資料規模更小的問題。比如,前面講的電影院的例子,你要知道,自己在哪一排 的問題,可以分解...