刷题笔记——青蛙跳台阶问题汇总

✨刷题笔记——青蛙跳台阶问题汇总


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

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

思路分析: 当n = 1, 只有1中跳法;当n = 2时,有两种跳法;当n = 3 时,有3种跳法;当n = 4时,有5种跳法;当n = 5时,有8种跳法;…

这道题的规律:类似于 Fibonacci数列: 指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

代码如下:

public class Solution {
    public int jumpFloor(int target) {
        if(target <=0) {
            return -1;
        }else if(target == 1) {
            return 1;
        }else if(target == 2) {
            return 2;
        }else {
            return jumpFloor(target-1) + jumpFloor(target-2);
             
        }

    }
}

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

一只青蛙一次可以跳上1级台阶,也可以跳上2 级……它也可以跳上n 级,此时该青蛙跳上一个n级的台阶总共有多少种跳法? 思路分析: 用Fib(n)表示青蛙跳上n阶台阶的跳法数,青蛙一次性跳上n阶台阶的跳法数1(n阶跳),设定Fib(0) = 1;

当n = 1 时, 只有一种跳法,即1阶跳:Fib(1) = 1;

   当n = 2 时, 有两种跳的方式,一阶跳和二阶跳:Fib(2) = Fib(1) + Fib(0) = 2;

   当n = 3 时,有三种跳的方式,第一次跳出一阶后,后面还有Fib(3-1)中跳法; 
   第一次跳出二阶后,后面还有Fib(3-2)中跳法;第一次跳出三阶后,后面还有Fib(3-3)中跳法

    Fib(3) = Fib(2) + Fib(1)+Fib(0)=4;

   当n = n 时,共有n种跳的方式,第一次跳出一阶后,后面还有Fib(n-1)中跳法;
   第一次跳出二阶后,后面还有Fib(n-2)中跳法...第一次跳出n阶后, 后面还有  Fib(n-n)中跳法.

   Fib(n) = Fib(n-1)+Fib(n-2)+Fib(n-3)+...+Fib(n-n)=Fib(0)+Fib(1)+Fib(2)+...+Fib(n-1)

  又因为Fib(n-1)=Fib(0)+Fib(1)+Fib(2)+...+Fib(n-2)

  两式相减得:Fib(n)-Fib(n-1)=Fib(n-1)  -->  Fib(n) = 2*Fib(n-1)     (n >= 2)

  递归等式如下:

代码如下:

public class Solution {
 public int jumpFloorII(int target) {
     if(target <= 1) {
         return 1;
     }
     return 2*jumpFloorII(target-1);
 }
}

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

思路: 这道题结合上一道题的思路,我们先列多项式

f(n) =  f(n-1) + f(n-2) + f(n-3) + ... + f(n-m)
   f(n-1) =   f(n-2) + f(n-3) + ... + f(n-m) + f(n-m-1)
 化简得:f(n) = 2f(n-1) - f(n-m-1)
分两种情况去讨论: 1.当n = m 的时候,如上一题 2.当n > m 的时候

代码如下:

public static int jumpFloorII(int n,int m ) {
         //当大于m的时候是上面的公式
         if(n > m){
             return 2*jumpFloorII(n-1, m)-jumpFloorII(n-1-m, m);
         }
         //当小于等于m的时候就是和n级的相同了
         if (n <= 1) {
             return 1;
         } else {
             return 2 * jumpFloorII(n - 1,n);
         }
     }
  }

总结

“种一颗树最好的是十年前,其次就是现在” 所以, “让我们一起努力吧,去奔赴更高更远的山海”

如果有错误❌,欢迎指正哟😋

经验分享 程序员 微信小程序 职场和发展