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