algorithm - 了解涉及生成器的递归函数

标签 algorithm swift recursion

我遇到了以下用 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 合着的“Functional Programming in Swift”一书

最佳答案

给定一个数组 [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])。

关于algorithm - 了解涉及生成器的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29954468/

相关文章:

c++ - 在 cpp 中计算数字的 n 次根时答案错误

algorithm - 有向强连通图中所有顶点对的最小切割

swift - 在 View Controller 之间设置变量

ios - 如何以编程方式在 ScrollView 中添加多个按钮

ruby - 算法/递归树挑战

java - 创建递归方法的返回类型

寻找相似公式的算法

c# - 在 .NET CF 中预处理和搜索文本文件的最佳方式

swift - 以编程方式快速添加 UITableViewCell

c - C 中递归的阶乘 : why my code is running?