我有一个递归调用的函数:
void myFunction(int j, int N){
if(j == N)
return;
for(int i = j +1 ; i < N ; ++i){
myfunction(i);
}
}
我的问题是return
将停止完全递归(来自第一个调用节点),但我希望它只停止最后一个节点。怎么可能?
编辑:似乎我的问题对每个人都不可理解,让我们改一下:(不要注意代码,它只是一个递归函数的例子)
为什么return
语句会停止递归调用的完整过程?我希望它只停止最后一次通话。
答案 0 :(得分:0)
您可以检查节点是否有子节点,如果不存在,则退出递归。
void myFunction(int j){
if(j->next == NULL)
return;
for(int i = j +1 ; i < N ; ++i){
myfunction(i);
}
}
答案 1 :(得分:0)
你可能不想在这样的循环中调用你的递归函数;更有可能的是,您希望使用void myFunction(int j, int N) {
if (j == N) {
return;
}
std::cout << j << std::endl;
myFunction(j + 1, N);
}
执行某些操作:
myFunction(0, 10)
现在,拨打0
会按升序排列9
到{{1}}的数字。
答案 2 :(得分:0)
return
仅影响即时功能。如果您return
来自递归函数并且所有父调用也结束,那么它不会导致return
,但每个父调用中的终端条件也必须变为真。< / p>
那就是:你的功能正在终止,因为它们都在测试并且都满足相同的条件。
以下是功能继续的示例:
#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
进行迭代,所以这个返回不会终止整个框架。