使用递归函数在Swift中生成组合

时间:2015-06-04 23:30:47

标签: swift

我有五个阵列。我可以使用五个for循环来生成结果,但我需要一个递归函数,以便我可以从更多数组生成组合。如何使用递归函数生成组合?每个组合包括五个阵列中的一个元素。

1 个答案:

答案 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]]
相关问题