• 青蛙跳台阶


    一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

    解答:

    假设f(n)是n个台阶跳的次数。

    1. f(1) = 1

    2. f(2) 会有两个跳得方式,一次1阶或者2阶,这回归到了问题f(1),f(2) = f(2-1) + f(2-2)

    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)

    4. f(n)时,会有n中跳的方式,1阶、2阶...n阶,得出结论:

    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);
            }
        }
    };

    or

    解:把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位。

    大佬级别详解:(算法)

    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 ",junp(n));
        }
        return 0;
    }
     
  • 相关阅读:
    springboot调优
    韩立刚计算机网络笔记-第08章 传输层
    韩立刚计算机网络笔记-第07章 网络层协议
    韩立刚计算机网络笔记-第06章 动态路由和静态路由
    韩立刚计算机网络笔记-第05章 IP地址和子网划分
    韩立刚计算机网络笔记-第04章 数据链路层
    韩立刚计算机网络笔记-第03章 GNS网络模拟器
    韩立刚计算机网络笔记-第02章 物理层
    韩立刚计算机网络笔记-第01章 计算机网络详解
    算法很美 笔记 12.图结构
  • 原文地址:https://www.cnblogs.com/gti2baby/p/10456606.html
Copyright © 2020-2023  润新知