欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

上台阶问题(递归设计)

程序员文章站 2022-06-04 18:35:28
...

问题: 楼梯有n阶台阶,一步可以走1个、2个或者3个台阶,一共有多少种上楼梯的方法?

代码实现:

#include<iostream>
using namespace std;

int cnt=0;//用于计数
void f(int n)//n表示还剩你个台阶需要走
{
    if(n<0) return; //防止死循环
    if(n==0)
    {
        cnt++;
        return;
    }
    f(n-1); //走一步
    f(n-2); //走两步
    f(n-3); //走三步
}
int main()
{
    int n;
    cin>>n;
    f(n);
    cout<<cnt;
    return 0;
}

缺陷: 当n比较大时,耗时巨大甚至可能爆栈。分析可知,在上述的递归中存在大量的重复子问题,做了大量的无用功。为了解决重复子问题,可以使用记忆型的递归进行优化。

代码实现:

#include<iostream>
using namespace std;


int dp[1001];//假设楼梯的台阶数可以达到1000
int f(int n)//n表示还剩你个台阶需要走
{
    if(dp[n]!=0) return dp[n];
    int cnt=0;//用于计数
    if(n<0) return 0; //防止死循环
    if(n==0)
    {
        cnt++;
        return cnt;
    }
    cnt+=f(n-1); //走一步
    cnt+=f(n-2); //走两步
    cnt+=f(n-3); //走三步
    dp[n]=cnt;
    return cnt;
}
int main()
{
    int n;
    cin>>n;
    cout<<f(n);
    return 0;
}