递归函数 - 楼梯

Posted

技术标签:

【中文标题】递归函数 - 楼梯【英文标题】:Recursive Functions- Stairs 【发布时间】:2020-08-03 11:59:36 【问题描述】:

我一直在使用递归函数,并在网上搜索了一些问题,以了解更多关于它们如何工作的信息。 我遇到了一个叫做楼梯的问题,这是为它设计的代码-

#include<bits/stdc++.h>

using namespace std;

int staircase(int n)
    if(n<0)            //Base Case 1
        return 0;
    

    if(n==0)           //Base Case 2
        return 1;
    

    int count = 0;
    count += staircase(n-1);    //Stepping 1 step
    count += staircase(n-2);    //Stepping 2 step
    count += staircase(n-3);    //Stepping 3 step

    return count;


int main()
    int n;
    cout<<"Enter number of stairs\n";

    cin>>n;

    cout<<"No of ways to climb stairs are ";
    cout<<staircase(n)<<endl;

    return 0;

如果有人能帮助我从“int count”理解楼梯函数我已经理解基本案例,那将非常有帮助!

【问题讨论】:

这是一篇详细解释递归的帖子***.com/questions/717725/understanding-recursion 不清楚。你的问题是什么? n 在你传入时变得越来越小(由于 n-1、n-2 和 n-3),最终达到 n == 1n &lt; 0 的基本情况.这将结束递归并总结所有返回调用堆栈的数字。 【参考方案1】:

基本上,这段代码试图找出你可以通过多少种方式到达第 n 步。如果您可以执行 1、2 或 3 个步骤,那么您可以从步骤 n-1、n-2 和 n-3 进入步骤 n。因此,到达第 n 步的路数是到达第 n-1、n-2 和 n-3 步的路数之和。该代码使用递归来实现这一点,通过使用不同的步骤号调用自身 3 次。

【讨论】:

【参考方案2】:

在每个函数调用中,您都有n 楼梯要爬。一次尝试,你可以爬一个楼梯,两个楼梯或三个楼梯。因此,您再次使用n = n - 1 调用该函数并将其结果添加到count。这个调用代表你只爬了一个楼梯的情况(还有n-1 楼梯要爬)。类似地,您添加爬 2 层楼梯后可能的方式数 (n = n - 2) 和爬 3 层楼梯后可能的方式数 (n = n - 3)。请注意,这个函数是指数函数,如果 n 是一个很大的数字,它会花费很长时间。您可以通过使用 memoization 来解决这个问题。

#include<bits/stdc++.h>

using namespace std;

const int MAX_SIZE = 100;

long long mem[MAX_SIZE];

int staircase(int n)
    if(n<0)            //Base Case 1
        return 0;
    

    if(n==0)           //Base Case 2
        return 1;
    

    if (mem[n] != -1)
        return mem[n];

    int count = 0;
    count += staircase(n-1);    //Stepping 1 step
    count += staircase(n-2);    //Stepping 2 step
    count += staircase(n-3);    //Stepping 3 step

    return mem[n] = count;


int main()

    for (int i = 0; i < MAX_SIZE; i++)
        mem[i] = -1;

    int n;
    cout<<"Enter number of stairs\n";

    cin>>n;

    cout<<"No of ways to climb stairs are ";
    cout<<staircase(n)<<endl;

    return 0;

这是使用 memoization 后的代码。请注意,如果没有记忆,计算所需的时间将非常长。例如,尝试使用n = 50 运行您的代码,并尝试使用此代码。另请注意,即使您可以将 MAX_SIZE 设置为 100,000 之类的值,即使在 n = 100 之前,结果也会非常大。如果你真的想计算 n 的大值的结果,你可以使用所谓的“大整数”。

【讨论】:

以上是关于递归函数 - 楼梯的主要内容,如果未能解决你的问题,请参考以下文章

递归函数 - 楼梯

【算法题】12.爬楼梯问题

JS递归的常见用法

初中递归题

递归----小白上楼梯

递归楼梯中的基本情况?