Elixir求和函数未返回预期结果问题排查
Elixir函数始终返回0的问题修复
你的代码问题核心在于Elixir的变量不可变性:你在for循环里尝试重新赋值result,但Elixir中变量一旦定义就无法被修改——每次result = result + i都是创建了一个仅在当前if块内有效的新局部变量,完全不会影响外层初始化为0的result。循环结束后,外层的result仍为初始值0,所以函数始终返回0。
以下是几种可行的修复方案:
方案1:用Enum.reduce实现累加
Enum.reduce是函数式编程中实现累加的标准方式,通过累加器(acc)逐步计算总和:
defmodule Challenge do def solution(number) do 0..(number - 1) |> Enum.reduce(0, fn i, acc -> if rem(i, 3) == 0 || rem(i, 5) == 0, do: acc + i, else: acc end) end end
方案2:for推导式过滤后求和
先通过for推导式筛选出符合条件的数字,再用Enum.sum直接求和,写法更简洁:
defmodule Challenge do def solution(number) do for i <- 0..(number - 1), rem(i, 3) == 0 or rem(i, 5) == 0, do: i |> Enum.sum() end end
方案3:过滤+求和的直观写法
先用Enum.filter筛选出3或5的倍数,再调用Enum.sum计算总和,逻辑最清晰:
defmodule Challenge do def solution(number) do 0..(number - 1) |> Enum.filter(fn i -> rem(i, 3) == 0 || rem(i, 5) == 0 end) |> Enum.sum() end end
以上三种方案都能通过你的测试用例:输入10时,计算的是0+3+5+6+9=23,与预期结果一致。
内容的提问来源于stack exchange,提问作者Stefan Glova
相关产品推荐
相关产品推荐

