return
只影响即时功能。如果从递归函数中获得return
并且所有父调用也结束,那么它不是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);
}
现场演示:http://ideone.com/9ePJEE
我早期输出仅适用于特定的深度,所以即使它是一个常数,我对测试,我正在对一个变量进行测试。但是,即使在第一次达到深度4后递归仍然继续。return
不会终止递归或父节点,只是立即函数调用。
您给出的示例函数测试j == N
其中N
是一个外部值,因此在递归框架内基本上是不变的;当一个功能看到它有效地达到N
,他们都会这样做,因此当最低功能看到N
时,整个循环就会展开。
---编辑---
你最近的一个例子,固定实际编译时,中止因为回路的约束。再次,return
不是问题,你只是有一个最大值(N),你的循环是所有同时工作。
http://ideone.com/SmKAuC
| | 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
,所以这回不会终止整个框架。
N从哪里来? –
*您可以控制递归何时停止,因此请调整您的终止条件! – crashmstr
你能否详细说明'会停止完整的递归吗?这没有意义:回报实际上不会突破所有其他功能。递归可以在调用函数体中继续。 – BeyelerStudios