【问题标题】:F# sum of all other elements in listF# 列表中所有其他元素的总和
【发布时间】:2017-06-15 23:50:36
【问题描述】:

假设我有一个这样的函数定义:

let sum (numbers: int list) =
    // code here

有哪些方法可以计算数字列表中所有其他元素的总和?所以如果输入是[3;5;3;7],结果是[(3, 15); (5, 13); (3, 15); (7, 11)]

我实际上对任何解决方案都感兴趣,尤其是那些使用函数式方法的解决方案。

谢谢

【问题讨论】:

  • 这既不是总和也不是“所有其他”。你展示的是列表元素的组合
  • @PanagiotisKanavos - 他不是在谈论组合。他说“我想拿这个列表,并为列表中的每个项目计算(排除该项目的列表)的总和。”这与组合不同,尽管他非常简短的示例并不能很清楚地说明这一事实。
  • @rmunn very clear 太轻描淡写了

标签: f# functional-programming


【解决方案1】:

您可以通过对列表求和然后为列表中的每个元素 x 返回一个 (x, sum - x) 元组来非常天真地做到这一点:

let sum (numbers: int list) : (int * int) list = 
    let s = List.sum numbers
    numbers |> List.map(fun x -> (x, s-x))

let nums = [3;5;3;7]
printfn "%A" (sum nums) // [(3, 15); (5, 13); (3, 15); (7, 11)]

【讨论】:

    【解决方案2】:

    您可以申请mapFold 并使用状态来查看是否已找到第一个匹配项。

    let excludeAndSum (numbers: int list) i = 
        numbers 
        |> Seq.mapFold (fun c i' -> (i', c||i<>i'), c||i=i') false |> fst
        |> Seq.filter snd
        |> Seq.sumBy fst
    
    let sum numbers = 
        List.map (fun i -> i , excludeAndSum numbers i) numbers
    

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      相关资源
      最近更新 更多