gpt4 book ai didi

f# - 这是用于相当快速的无限递归序列的惯用 F# 吗?

转载 作者:行者123 更新时间:2023-12-04 17:49:33 25 4
gpt4 key购买 nike

同时解决the 12th project euler problem我着手制作一个无限序列来获得连续的三角形数。我的第一次尝试是:

let slowTriangularNumbers =

let rec triangularNumbersFrom n =
seq {
yield seq { 0 .. n } |> Seq.sum
yield! triangularNumbersFrom (n + 1)
}

triangularNumbersFrom 1

结果证明这很慢 - 每次获取下一个项目时,它都必须计算导致 n 的所有加法。 .

我的下一次尝试是:
let fasterTriangularNumbers =

let cache = System.Collections.Generic.Dictionary<int, int>()
cache.[0] <- 0

let rec triangularNumbersFrom n =
seq {
cache.[n] <- cache.[n - 1] + n
yield cache.[n]
yield! triangularNumbersFrom (n + 1)
}

triangularNumbersFrom 1

引入可变字典已经大大加快了它的速度,但是拥有可变集合是否正常,或者还有其他方法可以表示状态吗?

最佳答案

我认为这是更惯用的:

Seq.unfold (fun (i, n) -> Some(n, (i+1, n+i))) (2, 1)

您可能更喜欢这种替代方法:
seq { 2 .. System.Int32.MaxValue }
|> Seq.scan (+) 1

关于f# - 这是用于相当快速的无限递归序列的惯用 F# 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20805735/

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