《劍指offer》的青蛙跳級演算法

2021-08-02 04:53:39 字數 1795 閱讀 7049

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

對於這種題,我們要先從數學的角度出發

若台階只有一級,則只有一種跳法,

若台階只有兩級,則只有兩種跳法,

當台階有**的時候,又分情況了,設n級的時候有f(n)種跳法,第一跳為1級,則還剩f(3-1)種跳法,第一跳為2級的時候,則還剩f(3-2)種跳法,

同理,第一跳為1級時,還剩f(n-1)種跳法,第一跳為2級時,還剩f(n-2)種跳法

所以得出結論,f(n) = f(n-1) + f(n-2), n>=3

這是乙個斐波那契數列!則有如下解法

/**

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

* */

#includeusing namespace std;

long fib(int n);

long fib1(int n);

long fib2(int n);

long tail(int n, int num1, int num2, int begin);

int main()

// 普通遞迴版本

long fib(int n)

else

if (n == 2)

else

if (n >= 3)

else

}// 迭代版本

long fib1(int n)

else

if (n >= 3)

return sum;

}}// 尾遞迴版本

long fib2(int n)

else

}long tail(int n, int num1, int num2, int begin)

else

}

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

同上,我們用數學的角度來看待這問題,

首先,一級台階的時候只有一種跳法,

二級台階的時候只有兩種跳法,

當**台階的時候,f(3) = f(3-1) + f(3-2) + f(3-3)

當四級台階的時候,f(4) = f(4-1) + f(4-2) + f(4-3) + f(4-4)

當n級台階的時候,f(n) = f(n-1) + f(n-2) + f(n-3) + …… + f(1) + f(n-n)

當n-1級台階的時候,f(n-1) = f(n-2) + f(n-3) + …… + f(1)

所以,f(n) = f(n-1) + f(n-1) + f(0), f(0) = 0

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

/**

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

* */

#includelong jump(int n);

int main()

long jump(int n)

else

if (n >= 3)

return -1;

}

劍指offer 青蛙跳台階

乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法 先後次序不同算不同的結果 這是一道比較簡單的動態規劃問題。n 1時,青蛙只能跳一次,即num 1 n 2時,青蛙可以有兩種方法,1 1,2 即num 2 n 3時,青蛙可以有三種方法,1 1 1,1 2,2 1...

劍指offer 青蛙跳台階

乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法 先後次序不同算不同的結果 public class solution if target 1 if target 2 return jumpfloor target 1 jumpfloor target 2 乙...

劍指offer 青蛙跳台階I 青蛙跳台階 II

i 題目 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法 先後次序不同算不同的結果 斐波那契數列變體,關鍵是找出遞推公式。假設跳n級台階有f n 中跳法,容易發現f 1 1,f 2 2 n 2時,如果最後一次跳一級台階,一共有f n 1 種跳法,如果最後一次...