2010-05-11 142 views
2
#include <iostream> 
using namespace std; 

int recur(int x) { 
    1 and recur(--x); 
    cout << x; 
    return x; 
} 

int main() { 
    recur(10); 
    return 0; 
} 
+4

'1和recur(-x)'是什么?'做?从来没有见过它 – RvdK 2010-05-11 08:18:33

+3

堆栈溢出? – 2010-05-11 08:19:38

+1

@Powe:'和'是'&&'的替代标记。这条线本身并没有什么意义(AND的左侧总是为真)并且可以写成“recur( - x)”。在这里,显然没有办法终止。 @lorb:为了停止递归,你需要在函数的顶部存在一个基本情况,而不需要另外调用它自己,比如'if(x == 0)return 0;'你也可以把'1'改成' x',当x为0时,将停止评估右侧。 – GManNickG 2010-05-11 08:19:53

回答

4
1 and recur(--x); 

相当于

recur(--x); 

显然你正在无限递归调用导致堆栈溢出,然后分段错误。

你的意思

x and recur(--x); 

这使得只有当x是非零的递归调用。

+0

...并以一种非常不明显的方式。倾向于tzaman提出的'if(x <= 0)return 0;',因为它更具可读性,并且在后面的代码更改导致'x'在向负无穷大的方向跳过0时更安全。 – msw 2010-05-11 08:58:39

5

这是一个无限递归。所以它会在堆栈空间用尽时进行故障排除。

2

它没有递归的终止条件,所以会递归,直到你用完堆栈空间。

2

recur是一个无限循环;你需要在那里放置一个基本条件,所以它停止调用自己。
例如(在功能的顶部)if (x <= 0) return 0;

另外,1 and有什么意义?这是一个无操作...也许你的意思是x and,这将停止递归,当x达到0,只要你有一个正数(负值将仍然会导致无限循环)recur

+0

负值不会造成无限循环,但您仍然可能会炸毁堆栈,所以它基本上是一样的东西。 – 2010-05-11 08:35:08

+1

递归函数不是__looping,__它是__recursing .__因此,它不是__endless循环,__而是__endless递归.__ – sbi 2010-05-11 08:46:52

相关问题