遞迴和迴圈問題

2021-10-03 19:41:17 字數 1112 閱讀 3117

斐波那契數列

青蛙跳台階

【題目】乙隻青蛙一次可以跳上1級台階,也可以跳上2級台階,求該青蛙跳上n級台階共有多少種跳法。

【思路】當n = 1,f(1) = 1;當n = 2,f(2) = 2;當n > 2,若第一次跳時跳1級台階,那麼剩下的n - 1級台階的跳法是f(n - 1),若第一次跳時跳2級台階,那麼剩下的n - 2級台階的跳法是f(n - 2),所以f(n) = f(n - 1) + f(n - 2),這是乙個斐波那契數列。

【擴充套件】乙隻青蛙一次可以跳上1級台階,也可以跳上2級台階,也可以跳上n級台階,求該青蛙跳上n級台階共有多少種跳法。

【思路】當n = 1,f(1) = 1;當n = 2,f(2) = 2;當n = 3,f(3) = 4…若第一次跳時跳1級台階,那麼剩下的n - 1級台階的跳法是f(n - 1),若第一次跳時跳2級台階,那麼剩下的n - 2級台階的跳法是f(n - 2)…若第一次跳時跳n - 1級台階,那麼剩下的1級台階的跳法是f(1),若第一次跳時跳n級台階,那麼不需要再跳,所以f(n) = f(n - 1) + f(n - 2) + … + f(1) + 1,遞推:

f(n) = 2 * f(n - 1)

f(n) = 2 * 2 * f(n - 2)

…f(n) = 2 ^ (n - 1)

8.2 矩形覆蓋

【題目】用n個2 x 1的小矩形去覆蓋乙個2 x n的大矩形共有多少種方法。

【思路】當n = 1,f(1) = 1;當n = 2,f(2) = 2;當n > 2,若第一次覆蓋時豎著放,那麼右邊還剩2 x (n - 1)的區域的覆蓋方法是f(n - 1),若第一次覆蓋時橫著放,那麼下邊必定也要再橫著放乙個,那麼右邊還剩2 x (n - 2)的區域的覆蓋方法是f(n - 2),所以f(n) = f(n - 1) + f(n - 2),這是乙個斐波那契數列。

這幾個題目都類似;

迴圈實現

public

intfibonacci2

(int n)

return sum;

}

遞迴實現

public

intfibonacci1

(int n)

遞迴和迴圈

從功能上來說,所有用遞迴實現的都可以用迴圈實現,只不過有時候遞迴實現方便一些,從效率上說,迴圈一般都是大於遞迴的。如果要處理的問題的深度不大,我認為遞迴和迭代的效率差不多。遞迴是消費棧空間,先遞推 壓棧 然後回歸 逐步釋放占用的棧 如果遞迴的深度比較大的話會很消耗記憶體,如果沒有終止條件會導致棧溢位...

遞迴和迴圈

很早之前看到過一段關於遞迴的解釋覺得很nice 今天寫了四道關於遞迴迴圈的題 大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項。n 39 f n f n 1 f n 2 第一眼看就是遞迴啊,簡直完美的遞迴環境,遞迴肯定很爽,這樣想著關鍵 兩三行就搞定了,注意這題的n是從0...

迴圈和遞迴

改為遞迴的關鍵是發現邏輯的 相似性 不要忘記遞迴的 出口 例子 使用遞迴模擬迴圈 列印0到9 public staitc void main string args 修改 列印0 n public static void f int n 接下來我們實現公升序的遞迴,比如列印0到9,這裡為了更一般化,...