劍指offer 遞迴和迴圈

2022-04-28 21:36:15 字數 1891 閱讀 3639

問題描述:

大家都知道斐波那契數列,現在要求輸入乙個整數 n,請你輸出斐波那契數列的第 n 項(從 0 開始,第 0 項為 0)。(n<=39)

方法一:

function fibonacci(n) 

var arr = [0, 1];

for (var i = 2; i <= n; i++)

return arr[n];

}

方法二:

function fibonacci(n) 

let triple = [0, 0, 1];

for (let i = 2; i <= n; i++)

return triple[2];

}

方法三:遞迴(效率低,執行時間長)

function fibonacci(n) 

return fibonacci(n - 1) + fibonacci(n - 2);

}

問題描述:

乙隻青蛙一次可以跳上 1 級台階,也可以跳上 2 級。求該青蛙跳上乙個 n 級的台階總共有多少種跳法(先後次序不同算不同的結果)。

解題思路:

這題其實就是在求斐波那契數列。理解起來也很簡單。假設跳到 n 級台階有 f(n)種方法。根據題目,青蛙在跳上 n 級時有 2 種方法:

青蛙跳到 n- 1 級有 f(n-1)種方法,跳到 n- 2 級有 f(n-2)種方法。所以 f(n) = f(n - 1) + f(n - 2)。這就是斐波那契數列的定義式。

function jumpfloor(number) 

var arr = [1, 2];

for (let i = 3; i <= number; i++)

return arr[arr.length - 1];

}

問題描述:

乙隻青蛙一次可以跳上 1 級台階,也可以跳上 2 級……它也可以跳上 n 級。求該青蛙跳上乙個 n 級的台階總共有多少種跳法。

解題思路:

假設跳 n 級台階的跳法數量是 f(n)個。假設跳 n 級台階的跳法數量是 f(n)個。

那麼根據題意,青蛙可能從 n-1 級直接跳上來,也可能從 n-2 級直接跳上來,依次類推:f(n) = f(n - 1) + f(n - 2) + ... + f(1)

同理:f(n - 1) = f(n - 2) + f(n - 3) + ... + f(1)

f(n) = 2 * f(n - 1) = 4 * f(n - 2) = ... = 2 ^ (n - 1)f(1)

其中: f(1) = 1

function jumpfloorii(number)
問題描述:

我們可以用 21 的小矩形橫著或者豎著去覆蓋更大的矩形。請問用 n 個 21 的小矩形無重疊地覆蓋乙個 2*n 的大矩形,總共有多少種方法?

比如 n=3 時,2*3 的矩形塊有 3 種覆蓋方法:

劍指offer 遞迴和迴圈

遞迴雖然比較簡潔,但他同時也有顯著的缺點。遞迴由於是函式呼叫自身,而函式呼叫是有時間和空間的消耗的,每一次函式呼叫都需要在記憶體棧中分配空間以儲存引數 返回位址及臨時變數,而且往棧裡壓入資料和彈出資料都需要時間。1 斐波那契數列 0,1,1,2,3,5,8,13 遞迴 缺陷 重複計算的太多 int ...

《劍指offer》 遞迴和迴圈

記錄一下牛客網上,劍指 offer 分割槽的考點為 遞迴和迴圈 的題,都很簡單,共 4 題 1 斐波那契數列 2 跳台階 3 跳台階 4 矩形覆蓋 1 斐波那契數列 int fibonacci int n return b 遞迴方式 很容易想到 但是ac不了,因為遞迴次數過多,棧溢位了 int fi...

劍指offer 迴圈遞迴

class solution return res 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。class solution return res 乙隻青蛙一次可以跳上1級台階,也可以跳上2級 它也可以跳上n級。求該青蛙跳上乙個n級的台階總共有多少種跳法...