Ocaml堆栈溢出,易于计算

use*_*674 3 syntax recursion 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);;
Run Code Online (Sandbox Code Playgroud)

数学问题简单如下:

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
Run Code Online (Sandbox Code Playgroud)

当我测试时sum 5,它弹出"堆栈溢出"错误,如下所示:

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

任何人都可以帮我吗?

nlu*_*oni 5

那是因为n在递归调用中没有被改变.你必须来包装n-1,并n-2在括号中.你打电话(sum n)-1而不是sum (n-1).


jer*_*rry 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);;
Run Code Online (Sandbox Code Playgroud)

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