上台阶问题(递归设计)

问题: 楼梯有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;
}
发布了15 篇原创文章 · 获赞 6 · 访问量 38

猜你喜欢

转载自blog.csdn.net/weixin_46165788/article/details/105520672