序
遇到了一個青蛙上臺階的算法問題 。
問
一隻小青蛙 ,一次可以跳一級臺階 ,也可以跳兩級臺階 ,問這隻小青蛙跳上 n 級臺階總共有多少種跳法 ?
思考
不可變因素是青蛙一次可以跳一級臺階或者一次可以跳兩級臺階 ,可變的因素是臺階有 n 級 。
分析 n 級臺階的可能性 。
No.1 : n = 1 ( 一共一級臺階 )
答案:小青蛙只有一隻跳法 。
No.2 : n = 2 (一共兩級臺階)
答案:青蛙有兩種跳法 ,一級一級跳 ,二級跳 。
No.3 : n > 2
此時有 n 個臺階 ,假設用函數 f(n) 表示總共跳的方法數 。
當小青蛙第一次跳一級臺階的話 ,則剩下的 n - 1 個 臺階 ,一共有 f(n - 1) 種跳法 。
當小青蛙第一次跳二級臺階的話 ,則剩下的 n - 2 個臺階 ,一共有 f(n - 2) 種跳法 。
所以結論就是 f(n) = f( n -1 ) + f( n - 2) ;
驗證一下 ,當 n = 1 時 ,f(n) = 1; 當 n = 2 時 ,f(n) = 2。
代碼實現
for 循環
private long frogJumpSteps( int n) {
int result[] = {0, 1, 2};
if (n < 3) {
return result[n];
}
long jumpCount1 = 1;
long jumpCount2 = 2;
long jumpCountn = 0;
for (int i = 3; i <= n; ++i) {
jumpCountn = jumpCount1 + jumpCount2;
jumpCount1 = jumpCount2;
jumpCount2 = jumpCountn;
}
return jumpCountn;
}
遞歸實現(感覺使用遞歸比較符合分析的流程)
public long frogJumpSteps(int n){
if(n < 1){ //沒有臺階 n = 0
return 0;
}
if(n == 1){ //一級臺階 n = 1
return 1;
}
if(n == 2){ //兩級臺階 n = 2
return 2;
}
return frogJumpSteps(n-1) + frogJumpSteps(n-2); //n級臺階 : f(n-1)+f(n-2)種跳法
}