Haskell递归实现阶乘函数栈溢出问题及语法求助
Haskell阶乘递归语法问题解决方案
错误原因
核心问题是你违反了Haskell的函数调用优先级规则:
- Haskell中函数应用的优先级高于所有算术运算符,你编写的
myFac x-1不会被识别为给myFac传入x-1作为参数,而是会被解析为(myFac x) - 1 - 这使得你的递归逻辑实际为
myFac x = x * (myFac x) - 1,递归调用时参数始终没有减小,永远触发不了myFac 1 = 1的终止条件,最终无限递归导致栈溢出。
修复方法
只需要给递归调用的参数部分加上括号,明确计算顺序即可,修改后代码如下:
myFac :: Integral a => a -> a myFac 1 = 1 myFac x = x * myFac (x - 1)
如果需要兼容0的阶乘计算(0的阶乘数学定义为1),可以调整终止条件:
myFac :: Integral a => a -> a myFac 0 = 1 myFac x = x * myFac (x - 1)
内容的提问来源于stack exchange,提问作者andand
相关产品推荐
相关产品推荐

