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
相关产品推荐
相关产品推荐

