C++ 如何停止递归?

C++ 如何停止递归?,c++,data-structures,recursion,C++,Data Structures,Recursion,下面的代码是查找树中的路径,该路径加起来等于给定的和。。。我在这里做的是将所有节点的值排队到一个数组路径中,如果条件递归满足,则打印它 void checkSum(NODE* root, int path[], int len, int sum){ if(root == NULL) return; path[len] = root->data; len++; if(sum - root->data == 0){

下面的代码是查找树中的路径,该路径加起来等于给定的和。。。我在这里做的是将所有节点的值排队到一个数组路径中,如果条件递归满足,则打印它

void checkSum(NODE* root, int path[], int len, int sum){

     if(root == NULL) return;

     path[len] = root->data;
     len++;

     if(sum - root->data == 0){ 
            sum -= root->data;
            cout<<"\nSum equals..."; 
            printPaths(path, len); 
     }
     else if(sum - root->data > 0){
          sum -= root->data;
          checkSum(root->left, path, len, sum);    
          checkSum(root->right, path, len, sum);
     }else { return; }
}

如果sum=7,则校验和\u secondroot->left,sum;执行三次,即,直到节点4,这里我们是否可以停止所有操作并只打印堆栈,即清空堆栈…

要提前终止递归,需要向调用链传递某种信号。在您的情况下,可以将返回类型更改为bool,并返回true以指示搜索已终止,无需进一步处理:

bool checkSum(NODE* root, int path[], int len, int sum) {
     if(root == NULL) return false;
     path[len] = root->data;
     len++;
     if (sum - root->data == 0){ 
          sum -= root->data;
          cout<<"\nSum equals..."; 
          printPaths(path, len);
          return true;
     } else if (sum - root->data > 0) {
          sum -= root->data;
          if (checkSum(root->left, path, len, sum)) {
              return true;
          }
          if (checkSum(root->right, path, len, sum)) {
              return true;
          }
     }
     return false;
}

请注意,在上面的代码中,递归调用仅在先前的调用继续返回false时继续进行。从调用返回的第一个true向上发送到调用链,导致整个调用链终止。

要提前终止递归,需要向调用链传递某种信号。在您的情况下,可以将返回类型更改为bool,并返回true以指示搜索已终止,无需进一步处理:

bool checkSum(NODE* root, int path[], int len, int sum) {
     if(root == NULL) return false;
     path[len] = root->data;
     len++;
     if (sum - root->data == 0){ 
          sum -= root->data;
          cout<<"\nSum equals..."; 
          printPaths(path, len);
          return true;
     } else if (sum - root->data > 0) {
          sum -= root->data;
          if (checkSum(root->left, path, len, sum)) {
              return true;
          }
          if (checkSum(root->right, path, len, sum)) {
              return true;
          }
     }
     return false;
}

请注意,在上面的代码中,递归调用仅在先前的调用继续返回false时继续进行。调用返回的第一个true将沿调用链向上发送,导致整个调用链终止。

如果您不想保存路径,请在到达第7个之后,向上移动图形并在途中打印每个节点

编辑:这是关于如何做到这一点的代码 请注意,这将:

从下到上打印路径 打印所有可能的路径 这是密码

void checkSum_second(NODE* originalRoot, NODE* root, int sum){

 if(root == NULL) return;

 if(sum - root->data == 0) { 
      //do something 
      NODE* tmp = root;
      while (tmp != originalRoot) {
           print(tmp->data);
           tmp = tmp->parent;
      }
 }     
 else if(sum - root->data > 0){
      sum -= root->data;                 
 }else return;


 checkSum_second(originalRoot,root->left, sum);
 checkSum_second(originalRoot,root->right, sum);     
 cout<<"\nvalue..."<<root->data;

}

如果您不想保存路径,请在到达7号之后,向上移动图形并打印途中的每个节点

编辑:这是关于如何做到这一点的代码 请注意,这将:

从下到上打印路径 打印所有可能的路径 这是密码

void checkSum_second(NODE* originalRoot, NODE* root, int sum){

 if(root == NULL) return;

 if(sum - root->data == 0) { 
      //do something 
      NODE* tmp = root;
      while (tmp != originalRoot) {
           print(tmp->data);
           tmp = tmp->parent;
      }
 }     
 else if(sum - root->data > 0){
      sum -= root->data;                 
 }else return;


 checkSum_second(originalRoot,root->left, sum);
 checkSum_second(originalRoot,root->right, sum);     
 cout<<"\nvalue..."<<root->data;

}

这应该将其倒置打印,但如果您不需要数据结构,我认为没有其他方法

当找到路径时,它返回true

void checkSum_second(NODE* root, int sum){
     if(root == NULL) return false;

     if(sum - root->data == 0)
     {
          cout<<"\nvalue..."<<root->data;
          return true;
     }
     else if(sum - root->data > 0)
          sum -= root->data;
     else return false;

     // if first is true, second won't get evaluated (it's the way || works)
     // if we found a path, print the current node and return true
     if (checkSum_second(root->left, sum) ||
         checkSum_second(root->right, sum))
     {
       cout<<"\nvalue..."<<root->data;
       return true;
     }
     return false;
}

这应该把它倒过来打印,但是如果你不想要数据结构,我认为没有其他方法

当找到路径时,它返回true

void checkSum_second(NODE* root, int sum){
     if(root == NULL) return false;

     if(sum - root->data == 0)
     {
          cout<<"\nvalue..."<<root->data;
          return true;
     }
     else if(sum - root->data > 0)
          sum -= root->data;
     else return false;

     // if first is true, second won't get evaluated (it's the way || works)
     // if we found a path, print the current node and return true
     if (checkSum_second(root->left, sum) ||
         checkSum_second(root->right, sum))
     {
       cout<<"\nvalue..."<<root->data;
       return true;
     }
     return false;
}

还可以使用不推荐使用C++的LangJMP,或者使用异常机制来跳回堆栈。@ VLADLAZARNEKO,RUNJMP不应该被精确地用于RAII原因。另一方面,除非调用链在异常情况下终止,例如在意外位置发现空值,或其他同样异常的情况,否则不应使用异常。希望,longjmp将很快使用安腾ABI并展开堆栈,就像Linux上NPTL的线程取消一样。我相信OP希望摆脱int path[],只在运行时打印路径——问题是——是否有其他方法可以在不使用任何数据结构的情况下打印至少一条路径?。不确定这一点或标题或两者是否都是实际问题,也可以使用不推荐使用C++的LangJMP来使用RAII或使用异常机制来跳回堆栈。另一方面,除非调用链在异常情况下终止,例如在意外位置发现空值,或其他同样异常的情况,否则不应使用异常。希望,longjmp将很快使用安腾ABI并展开堆栈,就像Linux上NPTL的线程取消一样。我相信OP希望摆脱int path[],只在运行时打印路径——问题是——是否有其他方法可以在不使用任何数据结构的情况下打印至少一条路径?。不确定这或标题或两者是否是实际问题。