【发布时间】: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,这是一个关于理解一小段代码的问题。
-
好的,感谢您的澄清和迁移。