我正在尝试编写一个以列表为例的函数

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)

最后,我能想到的最短选项是使用 mapimaxBy 函数:
list
|> Seq.mapi (fun i v -> i, v)
|> Seq.maxBy snd

关于f# - 在 F# 中查找列表最大值的索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35591062/

10-17 00:37
查看更多