https://gist.github.com/JadenGeller/5d49e46d4084fc493e72
他创建了结构体来处理排列:
var greetingPermutations = PermutationSequenceGenerator(elements: ["hi", "hey", "hello"])
while let greetingSequence = greetingPermutations.next(){
for greeting in greetingSequence {
print("\(greeting) ")
}
println()
}
或者:
var numberSpace = PermutationSpaceGenerator(objects: Array(1...4))
while let numberArray = numberSpace.next() {
println(numberArray)
}
编辑:
这里是在 objc.io 上找到的更简单的方法。
添加扩展。
extension Array {
var decompose : (head: T, tail: [T])? {
return (count > 0) ? (self[0], Array(self[1..<count])) : nil
}
}
在你的扩展/类之外添加。
infix operator >>= {}
func >>=<A, B>(xs: [A], f: A -> [B]) -> [B] {
return xs.map(f).reduce([], combine: +)
}
普通类函数
func between<T>(x: T, ys: [T]) -> [[T]] {
if let (head, tail) = ys.decompose {
return [[x] + ys] + between(x, ys: tail).map { [head] + $0 }
} else {
return [[x]]
}
}
func permutations<T>(xs: [T]) -> [[T]] {
if let (head, tail) = xs.decompose {
return permutations(tail) >>= { permTail in
self.between(head, ys: permTail)
}
} else {
return [[]]
}
}
测试
let example = permutations([1,2,3,5,6,7,8])
println(example)
这段代码扩展了 Array 的功能,添加了 decompose 函数和 >>== 运算符(用于扁平化)。关于扁平化的更多信息,请参见:
http://www.objc.io/snippets/4.html。