2013-03-03 190 views
-2

這段代碼有什麼問題?這是我正在做的簡化版本。這是一個遞歸函數調用相同的變量。傳遞參考

#include <iostream> 

using namespace std; 
void Foo(int& x) 
{ 
    x++; 
    Foo(x); 
    cout<<x<<"\n"; 
    if(x==10) 
     return; 
} 

int main() 
{ 
    int x=0; 
    Foo(x); 
    return 0; 
} 
+4

那麼,這個代碼**是什麼**錯? – 2013-03-03 22:59:25

+7

退出條件應該在*遞歸調用之前*不在之後。 – WhozCraig 2013-03-03 22:59:27

+1

我猜你從來沒有嘗試在調試器中單步執行這個算法,以確切地看到你的代碼在做什麼。如果你這樣做了,你可能會想出來。 – franji1 2013-03-03 23:25:52

回答

3

此功能沒有終止條件,它只是自稱無條件,試圖建立一個無限循環:

void Foo(int& x) 
{ 
    x++; 
    Foo(x); // <==== UNCONDITIONALLY RECURSIVE 
    cout<<x<<"\n"; 
    if(x==10) 
     return; 
} 

由於每個函數調用堆棧幀會佔用一些內存空間,無限遞歸是不可能的:遲早你的堆棧將超出其極限大小,並且你的程序將被迫終止。

+1

...因此它將耗盡堆棧空間。否則,人們可能會認爲它會永遠運行。 – 2013-03-03 23:00:55

+0

@JohnZwinck:正確。我只是認爲這是理所當然的。編輯,謝謝。 – 2013-03-03 23:04:02

3
x++; 
Foo(x); 
cout<<x<<"\n"; 
if(x==10) 
    return; 

問題是,這將導致無限遞歸。你只能在之後檢查if (x == 10)這個函數調用它自己,所以它不可能達到返回條件。通過寫入來解決此問題

x++; 
if(x==10) 
    return; 

Foo(x); 
cout<<x<<"\n"; 
1

您擁有無限遞歸。它將繼續創建棧幀,直到堆棧空間耗盡。在你的遞歸調用之前你需要一個出口衛士:

void Foo(int& x) 
{ 
    cout<<x<<"\n"; 
    if(x==10) 
     return; 
    x++; 
    Foo(x); 
}