這段代碼有什麼問題?這是我正在做的簡化版本。這是一個遞歸函數調用相同的變量。傳遞參考
#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;
}
這段代碼有什麼問題?這是我正在做的簡化版本。這是一個遞歸函數調用相同的變量。傳遞參考
#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;
}
此功能沒有終止條件,它只是自稱無條件,試圖建立一個無限循環:
void Foo(int& x)
{
x++;
Foo(x); // <==== UNCONDITIONALLY RECURSIVE
cout<<x<<"\n";
if(x==10)
return;
}
由於每個函數調用堆棧幀會佔用一些內存空間,無限遞歸是不可能的:遲早你的堆棧將超出其極限大小,並且你的程序將被迫終止。
...因此它將耗盡堆棧空間。否則,人們可能會認爲它會永遠運行。 – 2013-03-03 23:00:55
@JohnZwinck:正確。我只是認爲這是理所當然的。編輯,謝謝。 – 2013-03-03 23:04:02
x++;
Foo(x);
cout<<x<<"\n";
if(x==10)
return;
問題是,這將導致無限遞歸。你只能在之後檢查if (x == 10)
這個函數調用它自己,所以它不可能達到返回條件。通過寫入來解決此問題
x++;
if(x==10)
return;
Foo(x);
cout<<x<<"\n";
您擁有無限遞歸。它將繼續創建棧幀,直到堆棧空間耗盡。在你的遞歸調用之前你需要一個出口衛士:
void Foo(int& x)
{
cout<<x<<"\n";
if(x==10)
return;
x++;
Foo(x);
}
那麼,這個代碼**是什麼**錯? – 2013-03-03 22:59:25
退出條件應該在*遞歸調用之前*不在之後。 – WhozCraig 2013-03-03 22:59:27
我猜你從來沒有嘗試在調試器中單步執行這個算法,以確切地看到你的代碼在做什麼。如果你這樣做了,你可能會想出來。 – franji1 2013-03-03 23:25:52