C++ 为什么这是一个无限递归?
我编写了以下函数,以找出从起始单元格C++ 为什么这是一个无限递归?,c++,recursion,C++,Recursion,我编写了以下函数,以找出从起始单元格(0,0)到目标单元格(n,n)的路径数。就我个人而言,我无法理解为什么这是无限递归 代码如下: #include <iostream> using namespace std; int numOfPathsToDestUtil(int start, int end, int noOfPaths, int n) { cout<<"Start: "<<start<<" and end: "<<e
(0,0)
到目标单元格(n,n)
的路径数。就我个人而言,我无法理解为什么这是无限递归
代码如下:
#include <iostream>
using namespace std;
int numOfPathsToDestUtil(int start, int end, int noOfPaths, int n) {
cout<<"Start: "<<start<<" and end: "<<end<<"and n: "<<n<<"\n";
if(start==end && start==n)
return noOfPaths;
if(end<start)
return 0;
numOfPathsToDestUtil(start+1, end, noOfPaths+1,n) + numOfPathsToDestUtil(start, end+1, noOfPaths+1,n);
}
int numOfPathsToDest( int n )
{
cout<<"n is: "<<n<<"\n";
return numOfPathsToDestUtil(0,0,0,n);
}
int main() {
int ans = numOfPathsToDest(4);
cout<<ans;
return 0;
}
#包括
使用名称空间std;
int numOfPathsToDestUtil(int开始、int结束、int noOfPaths、int n){
cout如何调试:我建议您绘制一个调用树
- 此行缺少返回语句
numOfPathsToDestUtil(开始+1,结束,noOfPaths+1,n)+numOfPathsToDestUtil(开始,结束+1,noOfPaths+1,n)
- 仅考虑numOfPathsToDestUtil(开始、结束+1、noOfPaths+1、n)。
初始值(开始,结束)将是(0,0),然后调用=>(0,1)=>然后调用(0,2)=>(0,3)=>(0,4)=>(0,5)…结束时没有终止约束。此部分将进入无限循环
现在让我们整体来考虑(希望下面的解释对你来说很容易理解)
初始化(开始、结束、n、状态)
我认为您能够导出其余的,这表明您的递归将不容易导出
您需要修改约束,以确保只有“期望的”条件才能继续递归
- 如果end>n,是否继续递归
- 如果start==end但start
我不会全部列出。希望它能为您提供一个好的思考方向。如何调试:我建议您绘制一个调用树
- 此行缺少返回语句
numOfPathsToDestUtil(开始+1,结束,noOfPaths+1,n)+numOfPathsToDestUtil(开始,结束+1,noOfPaths+1,n)
- 仅考虑numOfPathsToDestUtil(开始、结束+1、noOfPaths+1、n)。
初始值(开始,结束)将是(0,0),然后调用=>(0,1)=>然后调用(0,2)=>(0,3)=>(0,4)=>(0,5)…结束时没有终止约束。此部分将进入无限循环
现在让我们整体来考虑(希望下面的解释对你来说很容易理解)
初始化(开始、结束、n、状态)
我认为您能够导出其余的,这表明您的递归将不容易导出
您需要修改约束,以确保只有“期望的”条件才能继续递归
- 如果end>n,是否继续递归
- 如果start==end但start
我不会一一列举。希望它能为您提供一个好的思考方向。让我们为您的电话贴上标签
numOfPathsToDestUtil(0,0,0,n) # original (O)
numOfPathsToDestUtil(start+1, end, noOfPaths+1,n) # first-recursive (FR)
numOfPathsToDestUtil(start, end+1, noOfPaths+1,n) # second-recursive (SR)
您的输出:
n is: 4
Start: 0 and end: 0and n: 4 # O - numOfPathsToDestUtil(0,0,0,4)
Start: 1 and end: 0and n: 4 # FR - numOfPathsToDestUtil(0+1,0,0,4)
Start: 0 and end: 1and n: 4 # SR - numOfPathsToDestUtil(0,0+1,0,4)
Start: 1 and end: 1and n: 4 # SR -> FR
Start: 2 and end: 1and n: 4 # SR -> FR -> FR
Start: 1 and end: 2and n: 4 # SR -> FR -> SR
Start: 2 and end: 2and n: 4 # SR -> FR -> SR -> FR
Start: 3 and end: 2and n: 4 # SR -> FR -> SR -> FR -> FR
Start: 2 and end: 3and n: 4 # SR -> FR -> SR -> FR -> SR
Start: 3 and end: 3and n: 4 # SR -> FR -> SR -> FR -> SR -> FR
Start: 4 and end: 3and n: 4 # SR -> FR -> SR -> FR -> SR -> FR -> FR
Start: 3 and end: 4and n: 4 # SR -> FR -> SR -> FR -> SR -> FR -> SR
Start: 4 and end: 4and n: 4 # SR -> FR -> SR -> FR -> SR -> FR -> SR -> FR (stops and returns value)
Start: 3 and end: 5and n: 4 # SR -> FR -> SR -> FR -> SR -> FR -> SR -> SR (never reaches where end==4 and n==4, keeps going and going)
Start: 4 and end: 5and n: 4
Start: 5 and end: 5and n: 4
Start: 6 and end: 5and n: 4
Start: 5 and end: 6and n: 4
Start: 6 and end: 6and n: 4
让我们给你的电话贴上标签
numOfPathsToDestUtil(0,0,0,n) # original (O)
numOfPathsToDestUtil(start+1, end, noOfPaths+1,n) # first-recursive (FR)
numOfPathsToDestUtil(start, end+1, noOfPaths+1,n) # second-recursive (SR)
您的输出:
n is: 4
Start: 0 and end: 0and n: 4 # O - numOfPathsToDestUtil(0,0,0,4)
Start: 1 and end: 0and n: 4 # FR - numOfPathsToDestUtil(0+1,0,0,4)
Start: 0 and end: 1and n: 4 # SR - numOfPathsToDestUtil(0,0+1,0,4)
Start: 1 and end: 1and n: 4 # SR -> FR
Start: 2 and end: 1and n: 4 # SR -> FR -> FR
Start: 1 and end: 2and n: 4 # SR -> FR -> SR
Start: 2 and end: 2and n: 4 # SR -> FR -> SR -> FR
Start: 3 and end: 2and n: 4 # SR -> FR -> SR -> FR -> FR
Start: 2 and end: 3and n: 4 # SR -> FR -> SR -> FR -> SR
Start: 3 and end: 3and n: 4 # SR -> FR -> SR -> FR -> SR -> FR
Start: 4 and end: 3and n: 4 # SR -> FR -> SR -> FR -> SR -> FR -> FR
Start: 3 and end: 4and n: 4 # SR -> FR -> SR -> FR -> SR -> FR -> SR
Start: 4 and end: 4and n: 4 # SR -> FR -> SR -> FR -> SR -> FR -> SR -> FR (stops and returns value)
Start: 3 and end: 5and n: 4 # SR -> FR -> SR -> FR -> SR -> FR -> SR -> SR (never reaches where end==4 and n==4, keeps going and going)
Start: 4 and end: 5and n: 4
Start: 5 and end: 5and n: 4
Start: 6 and end: 5and n: 4
Start: 5 and end: 6and n: 4
Start: 6 and end: 6and n: 4
如果总是到达它们,为什么在它们之后有一个递归调用?问题是有两个递归调用。您标记的位置是其中一个到达基本情况的位置,但另一个从未到达。@Umedhsinghbendela有一个导致无限递归的bug,而这个bug没有返回递归调用。@UmedhSinghBundela请确保递归调用的参数始终使您更接近基本情况。函数必须始终返回,否则它的格式不正确。会发生奇怪的事情。如果总是到达它们,为什么在它们之后有递归调用?问题是您有两个递归调用。您标记的位置是其中一个到达基本情况,但另一个从未到达。@umedhsinghbundera有一个导致无限递归的错误,还有一个你没有返回递归调用返回的值的错误。@umedhsinghbundera确保递归调用的参数总是让你更接近基本情况。函数mu我明白了。谢谢你的帮助!:)我希望我也能接受你的回答。我明白了。谢谢你的帮助!:)我希望我也能接受你的回答。