2010-05-11 141 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

相關問題