我是靠谱客的博主 激情宝马,最近开发中收集的这篇文章主要介绍跳台阶问题汇总,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. 跳台阶

题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
分析: 递推公式如下:
f ( n ) = { 1 n = 1 2 n = 2 f ( n − 1 ) + f ( n − 2 ) n > 2 f(n)=left{begin{array}{cc}1 & n=1 \ 2 & n=2 \ f(n-1)+f(n-2) & n>2end{array}right. f(n)=12f(n1)+f(n2)n=1n=2n>2

递归

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

非递归

class Solution {
public:
    int jumpFloor(int n) {
        if(n <= 2) return n;
        int temp, a1 = 1, a2 = 2;
        for(int i = 3; i <= n; i++){
            temp = a1 + a2;
            a1 = a2;
            a2 = temp;
        }
        return temp;
    }
};

2. 变态跳台阶

题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析: 递推公式如下:
f ( n ) = { 1 n = 1 2 n = 2 4 n = 3 8 n = 4 . . . . . . f(n)=left{begin{array}{cc}1 & n=1 \ 2 & n=2 \ 4 & n=3 \ 8 & n=4 \ ... & ... end{array}right. f(n)=1248...n=1n=2n=3n=4...
f ( n ) = 2 n − 1 f(n) = 2^{n-1} f(n)=2n1 f ( n ) = 2 f ( n − 1 ) f(n) = 2f(n-1) f(n)=2f(n1)

f ( n ) = f ( n − 1 ) + f ( n − 2 ) + ⋯ + f ( 1 ) + 1 f(n)=f(n-1)+f(n-2)+ dots +f(1) +1 f(n)=f(n1)+f(n2)++f(1)+1
f ( n − 1 ) = f ( n − 2 ) + ⋯ + f ( 1 ) + 1 f(n-1)=f(n-2)+ dots +f(1) +1 f(n1)=f(n2)++f(1)+1
f ( n ) = 2 f ( n − 1 ) f(n)=2f(n-1) f(n)=2f(n1)

class Solution {
public:
    int jumpFloorII(int n) {
        if(n <= 2) return n;
        else return 2*jumpFloorII(n-1);
    }
};
class Solution {
public:
    int jumpFloorII(int n) {
        if(n <= 1) return n;
        int res = 1;
        for(int i = 1; i < n; i++)
            res *= 2;
        return res;
    }
};

3. 跳台阶扩展

题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级,也可以跳上3级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析: 递推公式如下:
f ( n ) = { 1 n = 1 2 n = 2 4 n = 3 f ( n − 1 ) + f ( n − 2 ) + f ( n − 3 ) n > 3 f(n)=left{begin{array}{cc}1 & n=1 \ 2 & n=2 \ 4 & n=3 \ f(n-1)+f(n-2)+f(n-3) & n>3 end{array}right. f(n)=124f(n1)+f(n2)+f(n3)n=1n=2n=3n>3

#include <iostream>

using namespace std;

int f(int n){
    if(n<=2) return n;
    else if(n==3) return 4;
    else return f(n-1)+f(n-2)+f(n-3);

}
int main()
{
    int n;
    cin >> n;
    cout << f(n);
    return 0;
}
#include <iostream>

using namespace std;

int f(int n){
    if(n<=2) return n;
    if(n==3) return 4;
    int temp, a1=1,a2=2,a3=4;
    for(int i = 4; i <= n; i++){
        temp = a1+a2+a3;
        a1 = a2;
        a2 = a3;
        a3 = temp;
    }
    return temp;
}
int main()
{
    int n;
    cin >> n;
    cout << f(n);
    return 0;
}

m级,跳n阶台阶为:
f ( n ) = f ( n − 1 ) + f ( n − 2 ) + ⋯ + f ( n − m ) f(n)=f(n-1)+f(n-2)+ dots +f(n-m) f(n)=f(n1)+f(n2)++f(nm)
f ( n − 1 ) = f ( n − 2 ) + ⋯ + f ( n − m ) + f ( n − 1 − m ) f(n-1)=f(n-2)+ dots +f(n-m)+f(n-1-m) f(n1)=f(n2)++f(nm)+f(n1m)
f ( n ) = 2 f ( n − 1 ) − f ( n − m − 1 ) f(n)=2f(n-1)-f(n-m-1) f(n)=2f(n1)f(nm1)

4. 一只青蛙一次可以跳上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) = 2f(n-1) - f(n-m-1)
   
     public static int Jump4(int n,int m ) {
         //当n大于m的时候是上面的公式
         if(n > m){
             return 2*Jump4(n-1, m)-Jump4(n-1-m, m);
         }
         //当n小于等于m的时候就是和n级的相同了
         if (n <= 1) {
             return 1;
         } else {
             return 2 * Jump4(n - 1,n);
         }
     }
}

参考链接:
算法—青蛙跳台阶问题汇总

最后

以上就是激情宝马为你收集整理的跳台阶问题汇总的全部内容,希望文章能够帮你解决跳台阶问题汇总所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部