青蛙跳台阶算法分析

题目一

一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。(前后跳的步数不一样是不同的跳法)
分析:
1.当n=1时,只有一种跳法,[1]
2.当n=2时,有两种跳法,分别是[1,1],[2]
3.当n=3时,有三种跳法,分别为[1,1,1],[1,2],[2,1]
4.当n=4时,有五种跳法,分别为[1,1,1,1],[1,1,2],[1,2,1],[2,1,1],[2,2]
以此类推....当n>2时,f(n) = f(n-1) + f(n-2),即斐波那契数列的规律
代码如下:

    public static int jumpFloor(int n){
        if (n==0) return 0;
        if (n==1) return 1;
        if (n==2) return 2;
        return jumpFloor(n-1)+jumpFloor(n-2);
    }

题目二

一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级,也可跳上n级,求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
分析:
设定f(0)=1
当n = 1 时, 只有一种跳法,即1阶跳:f(1) = 1;
当n = 2 时, 有两种跳的方式,一阶跳和二阶跳:f(2) = f(1) + f(0) = 2;
当n = 3 时,有三种跳的方式,
第一次跳出一阶后,后面还有f(3-1)种;
第一次跳出二阶后,后面还有f(3-2)种;
第一次跳出三阶后,后面还有f(3-3)种;
f(3) = f(2) + f(1)+f(0)=4;
当n = n 时,共有n种跳的方式,
第一次跳出一阶后,后面还有f(n-1)种;
第一次跳出二阶后,后面还有f(n-2)种;
第一次跳出n阶后, 后面还有f(n-n)种;
所以f(n) = f(n-1) + f(n-2) + f(n-3) + ....+ f(n - (n-2) ) + f(n - (n-1) ) + f(n - n)
f(n-1) = f(n-2) + f(n-3) + .... + f(n - (n-2) ) + f(n - (n-1) ) + f(n - n)
两式子做差,得到 f(n) - f(n-1) = f(n-1) 即 f(n) = 2*f(n-1) (n >= 2)
代码如下:

    public static int jumpFloor(int n){
        if (n==0 || n==1) return 1;
        return 2 * jumpFloor(n-1);
    }

题目三

一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级,也可跳上m级,求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
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) = 2 * f(n-1) - f(n-m-1)
代码如下:

    public static int jumpFloor(int n,int m ) {
         //当大于m的时候是上面的公式
         if(n > m){
             return 2*jumpFloor(n-1, m)-jumpFloor(n-1-m, m);
         }
         //当小于等于m的时候就是和n级的相同了
         if (n <= 1) {
             return 1;
         } else {
             return 2 * jumpFloor(n - 1,n);
         }
     }
posted @ 2021-11-26 16:34  Mr_RainDrop  阅读(35)  评论(0)    收藏  举报