一隻青蛙一次能夠跳上1級臺階,也能夠跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(前後次序不一樣算不一樣的結果)。spa
這道題就是斐波那契數列的變形問法,由於跳上第N個臺階有兩種方式,第一個就是從第N-1個臺階上跳一級上來,第二個就是從第N-2個臺階上跳兩級上來。code
那麼求到第N個臺階的方法就轉變成求到第N-1臺階的辦法和到第N-2個臺階的方法,將二者相加便可,全部f(n)=f(n-1)+f(n-2),惟一一點區別在於初始值,這裏的初始值是blog
f(1) = 1;f(2)=2遞歸
能夠用遞歸和非遞歸保存前一個結果兩種方式來實現,具體可參考劍指offer系列中斐波那契那篇博文。get
一隻青蛙一次能夠跳上1級臺階,也能夠跳上2級……它也能夠跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。class
變態跳臺階相對於普通版本的跳臺階的改變在於第N個臺階不單單能夠由第N-1和第N-2個臺階到達,它是能夠從第它下面的任一個臺階到達,基礎
全部f(n) = f(n-1)+f(n-2)+f(n-3)+...+f(2)+f(1)+1,最後一個臺階是能夠直接從第0個臺階調到第N個臺階這種狀況,繼續推導方法
f(n) = f(n-1)+f(n-2)+f(n-3)+...+f(2)+f(1)+1,f(n+1) = f(n)+f(n-1)+f(n-2)+f(n-3)+...+f(2)+f(1)+1 = 2*f(n)di
f(1) = 1,f(2)=2=2*f(1)co
固然仍是能夠用遞歸和非遞歸兩種方式來解決
遞歸
1 public int JumpFloorII(int target) { 2 if(target==1){ 3 return 1; 4 }else{ 5 return 2*JumpFloorII(target-1); 6 } 7 }
非遞歸
1 public int JumpFloorII(int target) { 2 int[] saveData = new int[target+1]; 3 saveData[1] = 1; 4 for(int i=2;i<=target;i++){ 5 saveData[i] = 2*saveData[i-1]; 6 } 7 return saveData[target]; 8 }