我正在做一个程序,将所有奇数加到n:

oddSum' n result | n==0 = result
                 | otherwise = oddSum' (n-1) ((mod n 2)*(n)+result)

oddSum n = oddSum' n 0

我的输入有两个错误(我将它们放在下面),我正在使用尾部递归,为什么堆栈会发生溢出? (注意:我在Ubuntu上使用Hugs)

单数20000
错误-控制堆栈溢出

单数100000
错误-垃圾收集无法回收足够的空间

最佳答案

 oddSum 3
 oddSum 2 ((2 mod 2)*2 + 3)
 oddSum 1 ((1 mod 2)*1 + ((2 mod 2)*2 + 3))

您正在result变量中构建一个巨大的thunk。
一旦对此求值,所有的计算必须立即完成,然后堆栈溢出,因为例如要执行加法运算,您首先必须求值操作数以及操作数中加法的操作数。

如果otoh的thunk太大,那么堆就会溢出。

尝试使用
result `seq` ((mod n 2) * n + result)

在递归中。

07-28 08:21