【发布时间】:2013-12-27 18:18:21
【问题描述】:
在解决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
引入可变字典已经大大加快了它的速度,但是拥有一个可变集合是正常的吗,或者我可以用另一种方式来表示状态吗?
【问题讨论】:
标签: f# immutability seq