gpt4 book ai didi

f# - 如何在列表中找到出现函数最大值的值

转载 作者:行者123 更新时间:2023-12-04 17:28:32 26 4
gpt4 key购买 nike

我不仅要找到应用于列表的函数的最大值(为此我只使用 List.maxBy),还要找到发生在列表中的值。这感觉像是一个相当常见的操作,并且考虑到 F# 库的丰富性,我发现它实际上已经可用,但我似乎无法找到它,如果它是,我一点也不会感到惊讶!

为了举例说明,我希望能够映射一个列表 domain和一个函数 f

let domain = [0 .. 5]
let f x = -x * (x - 2)

(1, 1) (因为应用于列表中其他元素的函数小于 1)。

我首先尝试了这个:
let findMaximum domain f =
let candidates = [ for x in domain do
yield x, f x ]
let rec findMaximumHelper domain f currentMax =
match domain with
| [] -> currentMax
| head::tail ->
let cand = f head
match currentMax with
| None ->
let newMax = Some(head, cand)
findMaximumHelper tail f newMax
| Some(maxAt, possMax) ->
let newMax =
if cand > possMax then Some(head, cand)
else Some(maxAt, possMax)
findMaximumHelper tail f newMax
findMaximumHelper domain f None

let answer = findMaximum domain f

在这一点上我意识到这非常接近折叠操作,并放在一起
let findMaximum2 domain f =
let findMaximumHelper f acc x =
let cand = f x
match acc with
| None -> Some(x, cand)
| Some(maxAt, possMax) ->
if cand > possMax then Some(x, cand)
else Some(maxAt, possMax)
List.fold (findMaximumHelper f) None domain

let answer2 = findMaximum2 domain f

反而。

我的问题是,这些惯用的 F# 方法是否可以解决这个问题,或者确实有更好的方法来解决这个问题?

最佳答案

事实上,F# 库提供了所有必要的高阶函数来简洁地表达这一点:

domain
|> Seq.map (fun x -> x, f x)
|> Seq.maxBy snd

注:更新为使用 Seq.mapSeq.maxBy而不是 List.mapList.maxBy解决@ildjarn 对创建不必要的中间列表的担忧。

关于f# - 如何在列表中找到出现函数最大值的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5759993/

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