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时,它弹出“堆栈溢出”错误如下:

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

谁能帮帮我?

4

2 回答 2

5

那是因为n在递归调用中没有被改变。您必须将n-1andn-2括在括号中。你打电话(sum n)-1而不是sum (n-1).

于 2013-06-04T18:34:19.270 回答
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);;

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

于 2013-06-04T18:34:19.493 回答