2011-05-09 79 views
6

嘿即時嘗試刷新我的思想與一些遞歸。 我想添加從'開始'到'結束'的所有數字。遞歸添加數字序列

也就是說,如果開始爲1,並最終爲5那麼答案將是1 + 2 + 3 + 4 + 5 = 15

到目前爲止,我已經有了這個

int calc(int start, int end){ 
    if(start > end) 
     return total; 
    else{ 
     total = total + start; 
    return sum1(start++, end); 
    } 
} 

其不工作(我得到seg故障)。我究竟做錯了什麼?

編輯:對不起,我在我的實際代碼中使用相同的變量,當我寫這個我結束了他們作爲開始/結束,並忘記更改所有的代碼。

+0

切勿使用增量運營商時, 'start + 1'也可以。 – hugomg 2011-05-09 13:45:16

回答

7

什麼是fromto變量裏面的函數?也許你使用一些全局變量而不是使用startend,這就是爲什麼你有這個問題?另外你爲什麼在calc函數內使用sum1而不是calc

試試這個:

int calc(int start, int end){ 
    if(start > end) 
     return 0; 
    else 
     return start + calc(start + 1, end); 
} 
+0

謝謝:) 你首先回答說有(開始++,結束)在它導致了一個分段錯誤,但開始+1工作。爲什麼是這樣? – Sean 2011-05-09 04:34:19

+4

它應該是++的開始。預先增量而不是後增量。 start ++永遠不會遞增傳遞給遞歸函數的值並導致無限循環。因此分段錯誤。 – 2011-05-09 04:40:16

+0

真棒回覆Spendor,謝謝:D – Sean 2011-05-09 04:44:24

3

首先,你不使用你的函數參數(開始,結束),你正在使用(從,到)來代替。我假定來自或者是全局變量,或者你的代碼不能編譯。此外,總申報在哪裏?

這應該更好地工作:

int calc(int start, int end){ 
    if(start > end) 
     return 0; 
    else{ 
     return start + calc(start+1, end); 
    } 
} 
+0

我覺得你的遞歸調用需要'++ start'。 – 2011-05-09 04:15:00

+1

實際上應該是'start + 1'。 'start ++'是錯誤的,因爲它可以在語句前面的'start +'之前進行評估。 – ikegami 2011-05-09 04:36:54

+0

哦,你們是對的,我認爲看起來有趣,我應該改變它。 – GWW 2011-05-09 04:56:25

0

這工作得很好。

int calc(int from, int to) 
{ 
    if (from >= to) return to; 
    return from + calc(from + 1, to); 
} 
+1

'from ++'是錯誤的,因爲它可以在語句前面的'from'之前進行評估。它應該是從+ 1開始的。 – ikegami 2011-05-09 04:37:19

+1

它不是從++而是從++。 (預增) – 2011-05-09 04:38:54

+1

同樣適用於'++ from'。 '++ from'是錯誤的,因爲它可以在語句前面的'from'之前或之後進行評估。通常,不應該同時在表達式中更改和使用變量。 – ikegami 2011-05-09 04:47:18

3

順便說一句,這裏有一個更有效的解決方案:

int calc(int from, int to) 
{ 
    if (from == 0) 
     return to * (to+1)/2; 
    else 
     return calc(0, to) - calc(0, from); 
} 

它甚至遞歸!好了,直到你進一步簡化它

int calc(int from, int to) 
{ 
    return (to * (to+1) - from * (from+1))/2; 
} 

這是因爲F(N)= N + ... + 3 + 2 + 1 = N(N + 1)/ 2

+0

我認爲這個問題的最佳解決方案是由ikegami提出的。 有時你不必像現在這樣解決問題,並想出不同的方法來計算相同的事情。 ikegami所展示的是一個簡單的算法,用於將一系列的和加到一定數量上。它的工作效率也很高。 – Abhay 2011-05-09 14:54:15