青蛙跳臺階

一隻青蛙一次能夠跳上1級臺階,也能夠跳上2級……它也能夠跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。html

解答:java

假設f(n)是n個臺階跳的次數。算法

  1. f(1) = 1this

  2. f(2) 會有兩個跳得方式,一次1階或者2階,這回歸到了問題f(1),f(2) = f(2-1) + f(2-2)spa

  3. 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

  4. 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; }
相關文章
相關標籤/搜索