青蛙跳臺階問題
阿新 • • 發佈:2018-12-11
題目一:一隻青蛙一次可以跳上一級臺階,也可以跳上兩級臺階。求該青蛙跳上一個n級臺階總共有多少種跳法
分析:
當n=1時,只有一種跳法;
當n=2時,可以一次跳一級,也可以一次跳2級,有兩種跳法
當n>2時,第一次跳的時候有兩種選法,只跳一級,此時跳法數目等於後面剩下的n-1級臺階的跳法數目,即為f(n-1)
第一次跳2級,此時跳法的數目等於後面剩下的n-2級臺階的跳法數目,即為f(n-2)
總數f(n)=f(n-1)+f(n-2),實際上就是斐波那契數列的解法
非遞迴解法:
int jumpFloor(int number) { int ret[3]={0,1,2}; if(number<=2) { return ret[number]; } int first=2; int second=1; int sum=0; for(int i=3;i<=number;i++) { sum=first+second; first=second; second=sum; } return sum; }
題目二:一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。
分析:
當n=1時,有一種跳法
當n=2時,有2種跳法
當n>2時,第一次跳1級臺階後,後面還有f(n-1)種跳法,第一次跳2級臺階後,後面還有f(n-2)種跳法......,第一次跳n級後,後面還有f(n-n)種跳法
總的跳法:f(n)=f(n-1)+f(n-2)+...f(n-n)=f(0)+f(1)+f(2)+...f(n)
f(n-1)=(0)+f(1)+....f(n-2)
得出f(n)=2*f(n-1)(n=2)
非遞迴解法:
int jumpFloorII(int number) { int ret[3]={0,1,2}; if(number<=2) { return ret[number]; } int mid=2; int sum=0; for(int i=3;i<=number;i++) { sum=2*mid; second=sum; } return sum; }