【问题标题】:Recursive functions for sequences in F#F# 中序列的递归函数
【发布时间】:2012-07-12 12:20:40
【问题描述】:

相当琐碎的问题,但快速谷歌搜索并没有给我答案。

为序列编写递归函数的标准方法是什么?对于列表,您将使用空列表和头+尾模式进行模式匹配,序列的等价物是什么?

【问题讨论】:

    标签: recursion f# sequence


    【解决方案1】:

    没有标准的方法可以这样做,因为您很少为序列编写递归函数。

    您应该查看Seq module 中的各种高阶函数。它们通常绰绰有余,因此您不必自己编写递归函数。

    要递归生成序列,序列表达式是一种简单直观的方法:

    let rec allFiles dir =
        seq { yield! Directory.GetFiles dir
              for d in Directory.GetDirectories dir do
                yield! allFiles d }
    

    如果你必须分解一个序列并递归地操作它,你就做错了。您应该操作 ListLazyList from F# PowerPack,并将结果转换回序列。

    【讨论】:

    • 那么让我问一个更具体的问题:)
    • 是的,那太好了。没有具体细节很难回答这个问题。
    • 无论如何,我很惊讶没有简单的方法来获取序列上的(不可变的)迭代器。
    • 在那里回答了你的问题。你总是可以使用GetEnumerator(),但它是命令式的并且容易出错。
    【解决方案2】:

    没有办法得到序列的尾部,因为它没有被评估(理论上可能是无限的),所以你不能递归地将尾部传递给函数。您只需使用 Seq.iter 或 yield!遍历序列。

    【讨论】:

    • 您可以执行Seq.skip 1,这将标记评估项目后将跳过单个项目。
    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    相关资源
    最近更新 更多