2015-06-02 61 views
-2

的最後一個電話我有一個函數調用遞歸:C++:僅停止遞歸函數

void myFunction(int j, int N){ 
    if(j == N) 
     return; 
    for(int i = j +1 ; i < N ; ++i){ 
     myfunction(i); 
    } 
} 

我的問題是,return將停止全遞歸(從第一個主叫方節點),但我會像它只停止最後一個節點。這怎麼可能?

編輯:看來,我的問題是不是可以理解爲大家,讓我們重新整理措辭:(不注意的代碼,它僅僅是一個遞歸函數的例子)

爲什麼一個return語句停止遞歸調用的完整過程?我希望它只停止最後一次通話。

+1

N從哪裏來? –

+0

*您可以控制遞歸何時停止,因此請調整您的終止條件! – crashmstr

+0

你能否詳細說明'會停止完整的遞歸嗎?這沒有意義:回報實際上不會突破所有其他功能。遞歸可以在調用函數體中繼續。 – BeyelerStudios

回答

0

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,所以這回不會終止整個框架。

0

您可以檢查節點是否有子節點,如果沒有,則退出遞歸。

void myFunction(int j){ 
    if(j->next == NULL) 
     return; 
    for(int i = j +1 ; i < N ; ++i){ 
     myfunction(i); 
    } 
} 
+2

'j'是一個'int'。你不能做'j-> next'。 – lurker

+0

他的代碼真的沒有什麼意義。當他說節點時,我認爲節點意味着某種節點列表中的節點。 –

+1

我同意它沒有意義。直到確實有道理,它纔會被回答。 – lurker

0

你可能不想在這樣的循環中調用你的遞歸函數;更可能的是,你想要做的事與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升序排列。