这是我的代码:
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;错误如下:
评估期间堆栈溢出(循环递归?)。
有人可以帮帮我吗?
答案 0 :(得分:5)
这是因为递归调用中没有更改n
。您必须将n-1
和n-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
})从结果。由于输入永远不会改变,它会递归直到它溢出堆栈。