这段代码有什么问题?这是我正在做的简化版本。这是一个递归函数调用相同的变量。传递参考
#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