【问题标题】:Compare and reduce pairs in two lists比较和减少两个列表中的对
【发布时间】:2017-08-29 17:16:18
【问题描述】:

鉴于 Alice 的三元组和 Bob 的三元组(列表),我需要比较每个元素,所以如果 alice_triplet[i] > bob_triplet[i],Alice 的分数加一,反之亦然。

我有这个代码:

def main do
    alice_triplet = [5, 6, 7]
    bob_triplet = [3, 6, 10]

    alice_score = 0
    bob_score = 0

    Enum.zip(alice_triplet, bob_triplet) 
    |> Enum.each(fn 
        tuple when elem(tuple, 0) > elem(tuple, 1) -> alice_score = alice_score + 1
        tuple when elem(tuple, 1) > elem(tuple, 0) -> bob_score = bob_score + 1
        _ -> nil end)

    IO.puts alice_score
    IO.puts bob_score

end

但是,输出是:

0
0

为什么?我认为这是关于变量范围的,因为我收到了这个警告:

警告:变量“alice_score”未使用 solution.ex:12

警告:变量“bob_score”未使用 solution.ex:13

有没有“更实用”的方法来做到这一点?我正在学习 Elixir(实际上是一般的 FP),所以任何建议都将不胜感激。

【问题讨论】:

    标签: functional-programming elixir


    【解决方案1】:

    语句alice_score = alice_score + 1 不会修改外部alice_score,它会创建一个新的本地alice_score,其值设置为外部值+1。这已在manyanswers 中进行了介绍。解决方案几乎总是将Enum.reduce/3 与您需要更改的状态一起用作累加器。

    以下是如何将其应用于您的代码:

    alice_triplet = [5, 6, 7]
    bob_triplet = [3, 6, 10]
    
    {alice_score, bob_score} = Enum.zip(alice_triplet, bob_triplet) |>
    Enum.reduce({0, 0}, fn 
      tuple, {as, bs} when elem(tuple, 0) > elem(tuple, 1) -> {as + 1, bs} 
      tuple, {as, bs} when elem(tuple, 1) > elem(tuple, 0) -> {as, bs + 1}
      _, {as, bs}  -> {as, bs}
    end)
    
    IO.puts alice_score
    IO.puts bob_score
    

    您还可以使用模式匹配而不是 elem/2 来简化代码(elem/2 在惯用的 Elixir 代码中很少使用):

    alice_triplet = [5, 6, 7]
    bob_triplet = [3, 6, 10]
    
    {alice_score, bob_score} = Enum.zip(alice_triplet, bob_triplet) |> 
    Enum.reduce({0, 0}, fn 
      {a, b}, {as, bs} when a > b -> {as + 1, bs}
      {a, b}, {as, bs} when b > a -> {as, bs + 1}
      _, {as, bs}  -> {as, bs}
    end)
    
    IO.puts alice_score
    IO.puts bob_score
    

    两种情况的输出都是

    1
    1
    

    【讨论】:

    • 哇太棒了!非常感谢!
    猜你喜欢
    • 2017-05-05
    • 1970-01-01
    • 2017-05-17
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多