我有两个序列,一个名为Hand,有5个元素,另一个名为Deck,大小为n。我需要首先将Deck的第一个元素附加到Hand(创建大小为6的新Seq),然后在该新序列上运行一个函数来得到一个分数,例如50.然后我需要将Deck的第二个元素附加到Hand (同样是大小为6的新Seq)并运行该功能以获得25分。
这需要对Deck中的所有元素进行,以便我有一堆分数。这些分数是保存在列表中还是其他可能的并不重要。然后我需要找到所有这些结果的平均值并返回该值。
这是我之后的伪代码示例 -
Hand = {S2; C5; HK; D9; C1}, Deck = {...a bunch of cards...}
score[0] = CalcScore (Hand.append Deck[0]) //e.g. CalcScore ({S2; C5; HK; D9; C1; HJ})
score[1] = CalcScore (Hand.append Deck[1]) //e.g. CalcScore ({S2; C5; HK; D9; C1; D2})
score[n] = CalcScore (Hand.append Deck[n]) //e.g. CalcScore ({S2; C5; HK; D9; C1; SQ})
return averageScore = score.average
我知道如果我可以创建包含每个单独分数的列表或序列,我可以使用Seq.average / List.average但我不确定如何通过追加和运行函数来完成第1部分分别为每个元素保存并保存该值。
我很难理解如何创建高阶函数,F#对我来说是新的,与我熟悉的几种语言完全不同。
任何指导或信息都会有很大帮助,谢谢!
答案 0 :(得分:3)
首先,写一个函数来计算给卡附加的分数:
let scoreWithAppendedCard card =
CalcScore (Seq.append Hand [card])
真棒!现在为套牌中的每张卡片做到这一点:
let allScores = Deck |> Seq.map scoreWithAppendedCard
现在剩下的就是计算平均值:
let averageScore = Seq.average allScores
或者你可以一次完成所有这些,而无需命名中间值:
let averageScore =
Deck
|> Seq.map (fun card -> CalcScore (Seq.append Hand [card]))
|> Seq.average