我正在尝试编写一个以列表为例的函数
let list = [5;23;29;1]
let x = max list // This will return 2 because 29 will be the max value and it's "indexed" at position 2
我不确定如何编写
max
函数由于我的列表将只包含四个元素,我目前有一些这样的代码
let list = (1, newMap1 |> getScore) :: (2, newMap2 |> getScore) :: (3, newMap3 |> getScore) :: (4, newMap4 |> getScore) :: []
我认为这是一种糟糕的方法,但在找到
(x, _)
的最大值后,我仍然坚持如何返回 (_, y)
。我对命令式方法非常有信心,但我对如何在功能上做到这一点感到困惑 最佳答案
有几种方法可以做到这一点。在底层,您可以编写一个递归函数来对列表进行迭代和模式匹配。如果您正在学习 F#,这是一个很好的练习。
同样,您可以使用 fold
函数来实现这一点。这里的想法是我们保留一些状态,由“最佳值”和最佳值的索引组成。在每一步,我们要么保留原始信息,要么更新它:
let _, maxValue, maxIndex =
list |> List.fold (fun (index, maxSoFar, maxIndex) v ->
if v > maxSoFar then (index+1, v, index+1)
else (index+1, maxSoFar, maxIndex)) (-1, System.Int32.MinValue, -1)
最后,我能想到的最短选项是使用
mapi
和 maxBy
函数:list
|> Seq.mapi (fun i v -> i, v)
|> Seq.maxBy snd
关于f# - 在 F# 中查找列表最大值的索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35591062/