递归函数 - 楼梯
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 == 1
或 n < 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
的大值的结果,你可以使用所谓的“大整数”。
【讨论】:
以上是关于递归函数 - 楼梯的主要内容,如果未能解决你的问题,请参考以下文章