2017-03-04 64 views
-1

我在研究如何編程,並且最近一直在處理一個問題,該問題計算從最小值到最大值輸入的2個數字的總數。例如,如果有人輸入了數字4,7,則計算將是4 + 5 + 6 + 7 = 22。在C中編寫遞歸函數

我試過我認爲會是recSum的定義,但顯然這是錯誤的,因爲我得到了分段錯誤。我的定義有什麼問題?

/* Define the recursive function */ 
int recSum (int x, int max) 
{ 
int incrementalSum = 0; 
if (x == max) 
{ 
    return x; /* Exit if summated lower to upper numbers */ 
} 
else 
{ 
    return (x + recSum(x++, max)); /* My recursive call */ 
} 
} /* End of function call */ 

*新代碼顯示在上面,對不起,我使用了錯誤的代碼。

+0

如果你打算寫代碼一樣,如果它是20世紀70年代,至少使其可讀。 –

+0

你的'goto'構造等價於'while(1){...}'循環。循環不是遞歸。 – emlai

+0

您是否想爲練習目的編寫一個遞歸/迭代解決方案?或者您不知道用於總結1-n中所有整數的公式? – MikeMB

回答

2

您的代碼不工作的原因是這一行:

return x + recSum(x++, max); 

x++ x遞增,但返回以前的值,所以在遞歸調用它永遠不會增加你永遠達不到基本情況。像無限循環一樣。您必須將x++替換爲++x才能提供任何結果,即使它不正確。 ++x正在修改x,因此它將改變x + recSum的最終總和。你最好使用:

return x + recSum(x + 1, max); 

What is the difference between ++i and i++?

+0

你是男人!.... 現在的代碼工作。 –

5

你的代碼中有3點重要的問題

  1. 表達

    incrementalSum = x + x++; 
    

    是不確定的,read this for more information

  2. 你的函數不是遞歸的,遞歸函數調用它自己,直到條件發生在應該結束的地方。

  3. 同時指出,我不是非理性的「永遠不要使用goto」,這也正是爲什麼有些反對使用goto人的意見。

+0

'goto'上的便條... – alk

1

看來你指的是以下

int recSum(int x, int max) 
{ 
    return max < x ? 0 : x + recSum(x + 1, max); 
} 

或者,它甚至會更好申報像long long int函數的返回類型。

long long int recSum(int x, int max) 
{ 
    return max < x ? 0 : x + recSum(x + 1, max); 
} 

的功能可以被稱爲像

printf("%lld\n", recSum(4, 7)); 

至於你的函數,那麼在第一次調用退出

int recSum(int x, int max) 
{ 
    int incrementalSum = 0; 
    recCall: if (x < max) 
    return incrementalSum; 
    ^^^^^^^^^^^^^^^^^^^^^ 

因爲通常當x小於最大的叫法。所以這個功能沒有意義。而且這個函數不是遞歸的,因爲它不會調用它自己。

+0

卓越的觀察,這完成了我的答案。我認爲SO應該有一種方法來允許合併答案並分享用戶中的讚揚和讚揚。 –