如何停止递归
How to stop recursion?
下面的代码是to find the path in a tree that adds up to a given sum
…我在这里做的是enqueue
所有节点的值到一个数组path
如果条件满足递归打印它....
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; }
}
我想知道的是,有没有其他的方式,我可以打印路径(至少一个)不使用任何数据结构?
像这样....
void checkSum_second(NODE* root, int sum){
if(root == NULL) return;
if(sum - root->data == 0) {
//do something
}
else if(sum - root->data > 0){
sum -= root->data;
}else return;
checkSum_second(root->left, sum);
checkSum_second(root->right, sum);
cout<<"nvalue..."<<root->data;
}
考虑像
这样的树 1
2 3
4 5 6 7
如果sum = 7
, checkSum_second(root->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
被发送到调用链,导致整个调用链终止。
这应该倒过来打印,但我认为如果你不想要数据结构,没有其他方法。
当找到路径时返回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;
}
如果你不想保存路径,当你达到你的数字(7)后,向上移动图形,并在途中打印每个节点。
Edit:这是如何做到这一点的代码注意,这将:
- 从下往上打印路径
- 打印所有可能路径
代码
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;
}
相关文章:
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 在迭代模板类型列表时无法停止递归
- 使用参数推导时如何停止模板递归?
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 回文递归不停止
- Word.exe 已停止使用递归工作
- 是否有可能摆脱模板专用化以停止递归
- 模板递归不会停止
- 尽管有停止条件,无限递归调用仍会执行,因为参数不会前进
- 递归不会停止
- 在复杂的代码中,递归似乎不会停止
- 如何停止递归
- 基例如何影响使用递归函数的哪些行
- 停止递归算法
- 如果cin中没有输入任何内容,如何停止递归
- c++递归归并排序程序停止工作