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

标签 f# immutability seq

同时解决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/

相关文章:

r - 使用 seq 矢量方式

database - F# - 依赖管理

c# - C# 扩展方法和 F# 管道转发运算符之间有什么关系?

c++ - 从函数返回一个不可变的 POD 类

r - 获取每个人的每第 n 列的总和,并在 r 中创建新的数据框

r - seq_along 有效但 seq 产生意外结果的例子有哪些?

f# - Action 和 unit -> F# 中的 unit 类型之间的重载解析不明确

f# - 期望 LexBuffer<char> 但给定 LexBuffer<byte> 类型 'char' 与类型 'byte' 不匹配

c# - ReadOnlyCollection vs Liskov - 如何正确建模可变集合的不可变表示

xcode - 错误: "Cannot assign to immutable expression of type ' Bool'"?