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

Elixir阶乘函数逻辑异常:无法正确计算整数n的阶乘

问题分析与解决

你的阶乘函数出错的核心原因是Elixir是函数式编程语言,变量具有不可变性:

  • 你在for循环里的result = result * i并没有修改外部的result变量,只是在每次迭代中创建了一个新的局部变量result,外部的初始result始终保持为1。
  • 另外,Elixir中的for是推导式(generator),它的作用是生成一个列表,而非像命令式语言那样执行循环体来修改状态,你没有使用这个推导式的返回值,自然无法得到正确的计算结果。

修复方案

方案1:使用递归(函数式推荐写法)

递归是Elixir中处理这类累加计算的标准方式:

defmodule M do
  def factorial_(0), do: 1
  def factorial_(n) when n > 0 do
    n * factorial_(n - 1)
  end
end

IO.inspect(M.factorial_(5)) # 输出120

方案2:使用Enum.reduce累加

如果你更习惯迭代式的写法,可以用Enum.reduce来遍历范围并累加计算:

defmodule M do
  def factorial_(n) do
    Enum.reduce(1..n, 1, fn i, acc -> acc * i end)
  end
end

IO.inspect(M.factorial_(5)) # 输出120

若非要用for的写法

如果坚持使用for,可以利用它的reduce选项实现累加,但这并非最优写法:

defmodule M do
  def factorial_(n) do
    for i <- 1..n, reduce: 1 do
      acc -> acc * i
    end
  end
end

IO.inspect(M.factorial_(5)) # 输出120

内容的提问来源于stack exchange,提问作者a.c_hairy_limon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:32:36