2013-03-03 106 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); 
}