F#中的递归序列

杰布姆罗森

假设我要计算整数的阶乘。在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()”方法命令式样式吗?)

另外,有什么办法可以用函数将其概括化?例如,是否可以创建函数定义collat​​z函数的长度序列

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

F#中的尾递归:Quicksort的反转

来自分类Dev

F#中的尾递归:堆栈溢出

来自分类Dev

单线生成F#中的点序列

来自分类Dev

单线生成F#中的点序列

来自分类Dev

在 F# 中从多维数组创建序列

来自分类Dev

F#递归行为

来自分类Dev

F#递归行为

来自分类Dev

了解F#序列

来自分类Dev

了解F#序列

来自分类Dev

F#异步递归调用中的内存泄漏

来自分类Dev

递归如何对F#中的活动模式起作用?

来自分类Dev

F#中的递归和不变性

来自分类Dev

带记忆的F#中的递归阶乘函数

来自分类Dev

在F#中通过记忆递归查找阶乘的最佳方法

来自分类Dev

F#中更高效的递归Tetranacci函数

来自分类Dev

具有递归功能的F#中的背包问题

来自分类Dev

使用递归下降法解析F#中的嵌套括号

来自分类Dev

如何在F#中编写通用的递归扩展方法?

来自分类Dev

从F#中的序列构造中调用函数

来自分类Dev

这个惯用的F#是否可用于相当快速的无限递归序列?

来自分类Dev

堆栈溢出和递归序列表达式F#

来自分类Dev

尾递归映射f#

来自分类Dev

F#递归树验证

来自分类Dev

F#了解递归函数

来自分类Dev

F#和类型与递归?

来自分类Dev

如何实例化F#中的递减序列?

来自分类Dev

在F#中优化映射异步序列的语法

来自分类Dev

在F#中展平嵌套的异步序列

来自分类Dev

将F#中的平面序列延迟分组