我正在努力编写一个函数,其中 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.findIndex
或Seq.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