2013-06-04 80 views
3

這裏ocaml的堆棧溢出是我的代碼:方便計算

let rec sum n = 
    if n <= 0 then 0 
    else if n/2 * 2 = n then 3 * n + 50 * (sum n-2) 
    else n + 10 * (sum n-1);; 

的數學題很簡單如下:

sn = 
    0 if n = 0 
    50*sn-2 + 3*n, if n > 0 and n is even 
    10*sn-1 + n , if n > 0 and n is odd 

當我測試sum 5,它彈出「堆棧溢出」錯誤的如下:

評估期間堆棧溢出(循環遞歸?)。

任何人都可以幫助我嗎?

+0

總是仔細檢查你的遞歸​​:初始化,停止條件和遞歸。評估期間堆棧溢出意味着您的停止條件錯誤! – zmo

回答

5

這是因爲n在遞歸調用中沒有被改變。您必須將括號中的n-1n-2包裹起來。你打電話給(sum n)-1而不是sum (n-1)

+0

哦,是的..啊哈。謝謝! – user2170674

5

添加括號:

let rec sum n = 
    if n <= 0 then 0 
    else if n/2 * 2 = n then 3 * n + 50 * (sum (n-2)) 
    else n + 10 * (sum (n-1));; 

(* prints 3125 *) 
print_int (sum 5);; 

呼籲n-2(或n-1sum相反的,你調用它n並從結果中減去2(或1)。由於輸入不會改變,它會遞歸直到溢出堆棧。

+0

thx。是啊。我的錯。謝謝哥們! – user2170674