You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:36:08