我正在做一个程序,将所有奇数加到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)
在递归中。