0

我想獲得函數f(i)值的總和,當i等於a到b時,f(i)+ f(a + 1)+ ... + f(b-1)+ f(b) 所以我寫了這樣的代碼。我的代碼中是否存在無限循環?在ocaml

let rec sigma : (int -> int) -> int -> int -> int 
= fun f a b -> 
if a=b then f a 
else f b + sigma f a b-1 ;; 

但結果是在評估期間存在堆棧溢出。有無限循環嗎?爲什麼?

回答

2

sigma f a b-1被解析爲(sigma f a b) - 1而不是您的意圖,sigma f a (b-1)。由於sigma f a b在您的代碼中遞歸調用sigma f a b,因此它永不停止。

最佳做法是在二進制運算符周圍放置空格,如sigma f a b - 1,這樣就不會誤讀您寫的內容。

+4

順便說一句,本週我們已經收到了4次相同的問題。我們應該警告教師或助教。它是OCaml MOOC嗎? – camlspotter

+0

優秀點。 –

+0

謝謝你的回答,非常抱歉無法搜索問題。這不是MOOC。 – Volnyar