Ocaml堆栈溢出,易于计算

时间:2013-06-04 18:29:16

标签: recursion syntax 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时,它弹出&#34;堆栈溢出&#34;错误如下:

  

评估期间堆栈溢出(循环递归?)。

有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:5)

这是因为递归调用中没有更改n。您必须将n-1n-2括在括号中。您正在呼叫(sum n)-1而不是sum (n-1)

答案 1 :(得分: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);;

不是在sum(或n-2)上调用n-1,而是在n上调用它并减去2(或1 })从结果。由于输入永远不会改变,它会递归直到它溢出堆栈。