Ocaml堆栈溢出与简单计算

3
这是我的代码:
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时,出现了如下的"堆栈溢出"错误:

在求值过程中发生堆栈溢出(循环递归?)。

请问有人能帮我解决这个问题吗?

始终要仔细检查递归:初始化、停止条件和递归。在评估过程中出现堆栈溢出意味着您的停止条件是错误的! - zmo
2个回答

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


5
这是因为在递归调用中,n 没有改变。您需要将 n-1n-2 放入括号中。您正在调用 (sum n)-1 而不是 sum (n-1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接