我遇到了下面的遞歸算法,這裏寫在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))
}
的代碼是從書「函數式編程的雨燕採取克里斯Eidhof,弗洛裏安·庫格勒和沃特Swierstra
看來這主要是一個Swift的具體問題。它可能是一個常見的編程問題,但是代碼引用了特定語言的符號。編程網站會更合適。 – babou
由於這種算法的表達方式需要對Swift編程語言有充分的理解,因此它不適合[cs.se]。因此,我將它轉移到[所以]在主題上作爲理解一小段代碼的問題。 – Gilles
好的,謝謝澄清和遷移。 –