青蛙跳台阶

一只青蛙一次能够跳上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; }
相关文章
相关标签/搜索