Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这是一个无限递归?_C++_Recursion - Fatal编程技术网

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我明白了。谢谢你的帮助!:)我希望我也能接受你的回答。我明白了。谢谢你的帮助!:)我希望我也能接受你的回答。