gpt4 book ai didi

f# - 在 F# 中查找列表最大值的索引

转载 作者:行者123 更新时间:2023-12-02 10:23:04 26 4
gpt4 key购买 nike

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

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) :: []

我认为这是一种糟糕的方法,但在找到 (_, y) 的最大值后,我仍然卡在如何返回 (x, _) 上。我对命令式方法非常有信心,但我对如何在功能上做到这一点感到困惑

最佳答案

有几种方法可以做到这一点。在底层,您可以编写一个递归函数来对列表进行迭代和模式匹配。如果您正在学习 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com