假设我要计算整数的阶乘。在F#中,一种简单的方法是:
let rec fact (n: bigint) =
match n with
| x when x = 0I -> 1I
| _ -> n * fact (n-1I)
但是,如果我的程序需要动态编程,那么如何在使用备忘录的同时保持功能编程呢?
我的一个想法是制作一系列惰性元素,但遇到了一个问题。假定以下代码在F#中是可接受的(不是):
let rec facts =
seq {
yield 1I
for i in 1I..900I do
yield lazy (i * (facts |> Seq.item ((i-1I) |> int)))
}
F#中是否有与此想法类似的东西?(注意:我知道我可以使用.NET词典,但是不调用“ .Add()”方法命令式样式吗?)
另外,有什么办法可以用函数将其概括化?例如,是否可以创建由函数定义的collatz函数的长度序列:
let rec collatz n i =
if n = 0 || n = 1 then (i+1)
elif n % 2 = 0 then collatz (n/2) (i+1)
else collatz (3*n+1) (i+1)
如果您想懒惰地这样做,这是一个不错的方法:
let factorials =
Seq.initInfinite (fun n -> bigint n + 1I)
|> Seq.scan ((*)) 1I
|> Seq.cache
这Seq.cache
意味着您将不会重复评估已经枚举的元素。
然后,您可以使用例如来Seq.take n
获取特定数量的阶乘,或使用来获取特定的阶乘Seq.item n
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句