【问题标题】:Understanding a recursive function involving generators了解涉及生成器的递归函数
【发布时间】:2015-04-29 16:32:42
【问题描述】:

我遇到了以下递归算法,这里用 Swift 编写,给定一个数组,生成一个生成器,生成比原始数组短一个元素的子数组。通过删除每个索引处的一个元素来创建子数组。

即输入[1,2,3] 将返回生成[1,2] [2,3] [1,3] 的生成器。

该算法有效,但我很难理解如何。有人可以解释正在发生的事情,或者就如何分析或理解它提供建议吗?提前致谢

// Main algorithm 
func smaller1<T>(xs:[T]) -> GeneratorOf<[T]> {
    if let (head, tail) = xs.decompose {

        var gen1:GeneratorOf<[T]> = one(tail)

        var gen2:GeneratorOf<[T]> = map(smaller1(tail)) {
            smallerTail in
            return [head] + smallerTail
        }
        return gen1 + gen2
    }

    return one(nil)
}


// Auxillary functions used
func map<A, B>(var generator:GeneratorOf<A>, f:A -> B) -> GeneratorOf<B> {
    return GeneratorOf {
        return generator.next().map(f)
    }
}

func one<X>(x:X?) -> GeneratorOf<X> {
    return GeneratorOf(GeneratorOfOne(x))
}

代码摘自 Chris Eidhof、Florian Kugler 和 Wouter Swierstra 所著的《Swift 中的函数式编程》一书

【问题讨论】:

  • 这似乎很大程度上是 Swift 特有的问题。这可能是一个感兴趣的一般编程问题,但代码引用了特定于语言的符号。编程网站会更合适。
  • 由于该算法的表达方式需要对 Swift 编程语言有扎实的理解,所以不适合Computer Science 的问题。因此,我将其迁移到Stack Overflow,这是一个关于理解一小段代码的问题。
  • 好的,感谢您的澄清和迁移。

标签: algorithm swift recursion


【解决方案1】:

给定一个数组 [a_1,…,a_n],代码:

  • 生成子数组[a_2,…,a_n];
  • 对于 [a_2,…,a_n] 的每个子数组 B(递归生成),生成 [a_1] + B。

例如,给定数组 [1,2,3],我们:

  • 生成[2,3];
  • 对于[2,3]的每个子数组B(即[3]和[2]),生成[1] + B(这会生成[1,3]和[1,2])。

【讨论】:

  • 感谢您的解释,这真的很有帮助。你能解释一下你用来分解算法以便理解它的所有过程吗?
  • 我刚刚阅读了代码。它还有助于了解代码试图完成的工作。更一般地说,如果你卡住了,你应该尝试运行一些代码并查看它们的输出——将调试打印输出添加到代码中。这可以帮助您了解正在发生的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
相关资源
最近更新 更多