一隻青蛙一次能夠跳上1級臺階,也能夠跳上2級……它也能夠跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。html
解答:java
假設f(n)是n個臺階跳的次數。算法
-
f(1) = 1this
-
f(2) 會有兩個跳得方式,一次1階或者2階,這回歸到了問題f(1),f(2) = f(2-1) + f(2-2)spa
-
f(3) 會有三種跳得方式,1階、2階、3階,那麼就是第一次跳出1階後面剩下:f(3-1);第一次跳出2階,剩下f(3-2);第一次3階,那麼剩下f(3-3).所以結論是
f(3) = f(3-1)+f(3-2)+f(3-3)htm
-
f(n)時,會有n中跳的方式,1階、2階...n階,得出結論:blog
f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + ... + f(n-1) == f(n) = 2*f(n-1)遞歸
class Solution {
public:
int jumpFloorII(int number) {
if(number <= 0)
{
return 0;
}
else if(number == 1 || number == 2)
{
return number;
}
else
{
return 2 * jumpFloorII(number - 1);
}
}
};
orget
解:把n級臺階時的跳法記爲f(n),當n>2時,第一次跳的時候有兩種不一樣的選擇:一是第一次只跳1級,此時跳法數目等於後面剩下的n-1級臺階的跳法數目,即爲f(n-1);另一種是第一次跳2級,此時跳法數目等於後面剩下的n-2級臺階的跳法數目,即爲f(n-2);所以n級臺階時的跳法爲f(n)=f(n-1)+f(n-2)。不難看出這實際是斐波拉契數列的變形應用,把斐波拉契數列的每一項向前移動了1位。io
大佬級別詳解:(算法)
https://www.cnblogs.com/boguse/p/7583149.html
import java.util.HashMap;
//一隻青蛙一次能夠跳上1級臺階,也能夠跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
public class Solution {
//方法一:遞歸求解
public static int JumpFloor1(int n) {
if(n<1){
return 0;
}
if(n==1){
return 1;
}
if(n==2){
return 2;
}
return JumpFloor1(n-1)+JumpFloor1(n-2);
}
//方法二:備忘錄算法
public static int JumpFloor2(int n,HashMap<Integer,Integer> map) {
if(n<1){
return 0;
}
if(n==1){
return 1;
}
if(n==2){
return 2;
}
if(map.containsKey(n)){
return map.get(n);
}else{
int value=JumpFloor2(n-1, map)+JumpFloor2(n-2, map);
map.put(n, value);
return value;
}
}
//方法三:動態規劃求解
public static void main(String[] args){
HashMap map=new HashMap();
System.out.println(Solution.JumpFloor1(40));
System.out.println(Solution.JumpFloor2(40,map));
}
}
this is mine :
#include<stdio.h> long long junp(long long n) { if(n==1||n==2) return n; return 2*junp(n-1); } int main() { long long n; while(scanf("%lld",&n)!=EOF) { printf("%lld\n",junp(n)); } return 0; }