我有五个阵列。我可以使用五个for循环来生成结果,但我需要一个递归函数,以便我可以从更多数组生成组合。如何使用递归函数生成组合?每个组合包括五个阵列中的一个元素。
答案 0 :(得分:4)
我不确定为什么你需要递归,但无论如何,有几种方法可以做到这一点。您可以使用高阶函数来生成符合您需要的数组扩展:
extension Array {
func everyOf<S: SequenceType where S.Generator.Element == T>(ar: S...) -> [[T]] {
return ar.reduce(self.map{[$0]}){
perms, items in perms.flatMap {
perm in Swift.map(items){ perm + [$0] }
}
}
}
}
这就像:
[1, 2].everyOf([3, 4]) //[[1, 3], [1, 4], [2, 3], [2, 4]]
或:
[1, 2].everyOf([3, 4], [5, 6])
//[
// [1, 3, 5],
// [1, 3, 6],
// [1, 4, 5],
// [1, 4, 6],
// [2, 3, 5],
// [2, 3, 6],
// [2, 4, 5],
// [2, 4, 6]
//]
但是不同的阵列不必具有相同的长度:
[1, 2].everyOf([3], [5, 6]) // [[1, 3, 5], [1, 3, 6], [2, 3, 5], [2, 3, 6]]
你也可以将其作为一种非方法:
func everyOf<T>(ar: [[T]]) -> [[T]] {
return dropLast(ar).reduce(ar.last!.map{[$0]}){
perms, items in perms.flatMap{
perm in Swift.map(items){ perm + [$0] }
}
}
}
everyOf([[1, 2], [3, 4]]) // [[3, 1], [3, 2], [4, 1], [4, 2]]
但是,如果你真的进入了这次递归,那么你可以去:
func everyOf<T>(seqs: [[T]]) -> [[T]] {
return last(seqs).map {
fSeq in everyOf(Array(dropLast(seqs))).flatMap {
seq in fSeq.map{ seq + [$0] }
}
} ?? [[]]
}
everyOf([[1, 2], [3, 4]]) // [[3, 1], [3, 2], [4, 1], [4, 2]]