青蛙跳臺階

aa568551096發表於2018-04-06

wang-程式設計日記四:

青蛙跳臺階問題(斐波拉契蛾數列應用)

一隻青蛙一次可以跳上1級臺階,也可以跳上2級臺階,請問這隻青蛙跳上n級臺階總共有多少種跳法?

解法一://遞迴 

青蛙只有兩種跳法要麼跳一級要麼跳兩級,如果從第n次開始回溯這思考,(n有兩種可能n-1或n-2,n-1有兩種可能n-2或n-3,n-2有兩種可能n-3或n-4)。

所以從第一次開始思考(假設臺階大於2,那麼3有兩種可能1或2,4有兩種可能3或2,··)發現規律當前臺階數可能跳法=臺階數-1可能跳法+臺階數-2可能跳法(f(n) = f(n - 1)+f(n -2))遞迴實現還是比較簡單的。

程式碼:

int fun(int n )
{
if (n == 2)
return 2;
else if (n == 1)
return 1;
else if (n == 0)
return 0;
return fun(n - 1) + fun(n - 2);
}

解法2://動態規劃(意思可以百度)

                 5

          4                   3

      3    2              2     1

  2           1


在解法1中會發現假設n=5,那麼他要計算重複的兩次n = 3,如果n的次數增大則重複計算的次數也越多,所以如果把計算過的n存在陣列中,每次計算直接利用訪問陣列那麼計算速度就會優化非常多

程式碼:

int climbStairs(int n) {
vector<int> memory(n+1,-1);
memory[0] = 0;
memory[1] = 1;
memory[2] = 2;
for (int i = 3; i <= n; i++)
memory[i] = memory[i - 1] + memory[i - 2];
return memory[n];
}



相關文章