f#在序列中找到所有元素的函数的最低结果



我正在努力编写一个函数,其中 Hand= {C2; H8; DK; S1}表示序列,并通过第1个删除元素找到最低的整数结果,然后使用我命名为CounculatesCore((到(到找到该新序列的分数。它对序列中的所有元素都可以做到这一点,但仅删除1个元素,而不是之前的元素,因此第一次运行将删除C2并计算得分,然后它将删除H8(不删除C2(并计算得分。一旦计算出所有分数,就需要找到最低值并返回该元素的分数。

这是我所指的非常蛮力的non-f#伪代码示例:

Hand= {C2; H8; DK; S1}, i = 0
NewHand = Hand[i].remove
Score = CalculateScore(newHand)
elementIndex = i
i++
NewHand = Hand[i].remove
if Score > CalculateScore(NewHand) 
    then Score = NewHand, elementIndex = i
i++
.........
return elementIndex

我已经很长时间没做F#,而且我不太擅长创建高级功能和类似的东西,这就是为什么我正在挣扎。

当您在高阶功能方面遇到问题以及如何构成它们时,通常从写下您希望应用的转换开始。

let calcScoreAfterRemovingElement s el =
    s
    |> Seq.filter ((<>) el)
    |> calcScore

在这里,我们从序列中删除元素,然后计算得分。

现在,要将此转换应用于列表中的每个元素并计算最小值,我们可以简单地:

Seq.minBy (calcScoreAfterRemovingElement s) s

是:

的速记
Seq.minBy (fun el -> calcScoreAfterRemovingElement s el) s

当我们将元素=>映射到过滤序列=>时,并返回最小值。

例如,如果我们使用calcCard功能而不是calcScore,则可以:

let calcScoreAfterRemovingElement s el =
    s
    |> Seq.filter ((<>) el)
    |> Seq.sumBy calcCard

在这里您删除(当前(元素,映射过滤序列的元素与它们相应的值并总和它们。

编辑

您可以使用Seq.findIndexSeq.tryFindIndex获得索引,但这将打破管道。让我们尝试一种不同的方法:

Seq.minBy (calcScoreAfterRemovingElement s) s

=

s
|> Seq.map (calcScoreAfterRemovingElement s)
|> Seq.min

提取索引

s
|> Seq.map (calcScoreAfterRemovingElement s)
|> Seq.indexed
|> Seq.minBy snd
|> fst

=

s
|> Seq.mapi (fun i el -> i , calcScoreAfterRemovingElement s el)
|> Seq.minBy snd
|> fst

最新更新