c ++:仅停止递归函数的最后一次调用
c++ : stop only last call of recursive function
我有一个递归调用的函数:
void myFunction(int j, int N){
if(j == N)
return;
for(int i = j +1 ; i < N ; ++i){
myfunction(i);
}
}
我的问题是 return
将停止完整递归(从第一个调用节点开始),但我希望它只停止最后一个节点。这怎么可能?
编辑:看来我的问题大家看不懂,改一下吧:(不要看代码,只是一个递归的例子函数)
为什么 return
语句会停止递归调用的整个过程?我希望它只停止最后一次通话。
您可以检查该节点是否有子节点,如果没有则退出递归。
void myFunction(int j){
if(j->next == NULL)
return;
for(int i = j +1 ; i < N ; ++i){
myfunction(i);
}
}
您可能不想在这样的循环中调用递归函数;更有可能的是,您想用 j + 1
:
做点什么
void myFunction(int j, int N) {
if (j == N) {
return;
}
std::cout << j << std::endl;
myFunction(j + 1, N);
}
现在,调用 myFunction(0, 10)
将按升序打印数字 0
到 9
。
return
只影响立即函数。如果您从递归函数 return
ing 并且所有父调用也结束,那么不是 return
导致的,而是每个父调用中的终止条件也必须变为真。
也就是说:您的函数正在终止,因为它们都在测试并且都满足相同的条件。
以下是函数继续的例子:
#include <iostream>
std::string padding = " ";
void f(int i, int d) {
if (d == 4) // only go 4 deep
return;
std::string pfx = padding.substr(0, d);
for (int i = 0; i < 5; ++i) {
std::cout << pfx << "i:" << i << ", d:" << d << "\n";
f(0, d + 1);
}
}
int main() {
f(0, 0);
}
我的提早出局只适用于特定深度,所以尽管我测试的是一个常数,但我测试的是一个变量。然而,即使在我第一次到达深度 4 之后,递归仍在继续。return
不会终止递归或父级,只会终止直接函数调用。
您提供的示例函数测试 j == N
其中 N
是一个外部值,因此在您的递归框架内基本不变;当一个函数看到它有效地达到 N
时,所有函数都会有效地达到,因此当最低函数看到 N
时,您的整个循环就会展开。
--- 编辑 ---
您的最新示例在修复为实际编译时由于循环约束而中止。同样,return
不是问题,您只有一个最大值 (N),您的循环 all 同时工作。
| | for (i = 3; i < 3)
| | reached 'N' at this level, returning
| reached 'N' at this level, returning
loop iter with i = 2
| j:2, N:3
| for (i = 3; i < 3)
| reached 'N' at this level, returning
在您的示例代码的这个版本中,我们从未达到显式 return
我们只是 运行 失去了功能,即便如此,我们还是用 i = 2
进行了迭代,所以return 不会终止整个帧。
我有一个递归调用的函数:
void myFunction(int j, int N){
if(j == N)
return;
for(int i = j +1 ; i < N ; ++i){
myfunction(i);
}
}
我的问题是 return
将停止完整递归(从第一个调用节点开始),但我希望它只停止最后一个节点。这怎么可能?
编辑:看来我的问题大家看不懂,改一下吧:(不要看代码,只是一个递归的例子函数)
为什么 return
语句会停止递归调用的整个过程?我希望它只停止最后一次通话。
您可以检查该节点是否有子节点,如果没有则退出递归。
void myFunction(int j){
if(j->next == NULL)
return;
for(int i = j +1 ; i < N ; ++i){
myfunction(i);
}
}
您可能不想在这样的循环中调用递归函数;更有可能的是,您想用 j + 1
:
void myFunction(int j, int N) {
if (j == N) {
return;
}
std::cout << j << std::endl;
myFunction(j + 1, N);
}
现在,调用 myFunction(0, 10)
将按升序打印数字 0
到 9
。
return
只影响立即函数。如果您从递归函数 return
ing 并且所有父调用也结束,那么不是 return
导致的,而是每个父调用中的终止条件也必须变为真。
也就是说:您的函数正在终止,因为它们都在测试并且都满足相同的条件。
以下是函数继续的例子:
#include <iostream>
std::string padding = " ";
void f(int i, int d) {
if (d == 4) // only go 4 deep
return;
std::string pfx = padding.substr(0, d);
for (int i = 0; i < 5; ++i) {
std::cout << pfx << "i:" << i << ", d:" << d << "\n";
f(0, d + 1);
}
}
int main() {
f(0, 0);
}
我的提早出局只适用于特定深度,所以尽管我测试的是一个常数,但我测试的是一个变量。然而,即使在我第一次到达深度 4 之后,递归仍在继续。return
不会终止递归或父级,只会终止直接函数调用。
您提供的示例函数测试 j == N
其中 N
是一个外部值,因此在您的递归框架内基本不变;当一个函数看到它有效地达到 N
时,所有函数都会有效地达到,因此当最低函数看到 N
时,您的整个循环就会展开。
--- 编辑 ---
您的最新示例在修复为实际编译时由于循环约束而中止。同样,return
不是问题,您只有一个最大值 (N),您的循环 all 同时工作。
| | for (i = 3; i < 3)
| | reached 'N' at this level, returning
| reached 'N' at this level, returning
loop iter with i = 2
| j:2, N:3
| for (i = 3; i < 3)
| reached 'N' at this level, returning
在您的示例代码的这个版本中,我们从未达到显式 return
我们只是 运行 失去了功能,即便如此,我们还是用 i = 2
进行了迭代,所以return 不会终止整个帧。