2017-10-04 53 views
-1
func combinations<T>(of array: [[T]]) -> [[T]] { 
    return array.reduce([[]]) { combihelper(a1: $0, a2: $1) } 
} 

func combihelper<T>(a1: [[T]], a2: [T]) -> [[T]] { 
    var x = [[T]]() 
    for elem1 in a1 { 
     for elem2 in a2 { 
      x.append(elem1 + [elem2]) 
     } 
    } 
    return x 
} 

什么是在一个func中编写代码的最佳解决方案?swift 4种组合func

+0

你能提供一个关于该功能应该做什么的例子的描述吗? –

+0

是的,当然。它给你参数的组合。例如,var par = [[Double]]() par.append(Array(stride(from:0,through:10,by:1.0))) par.append(Array(stride(from:-10 ,通过:0,通过:1.0))) let comb = combinations(of:par) – Anton

回答

2

如果你想要的是这两种方法结合成一个单一的一个只是改变A1至$ O,并且A $ 1:

func combinations<T>(of array: [[T]]) -> [[T]] { 
    return array.reduce([[]]) { 
     var x = [[T]]() 
     for elem1 in $0 { 
      for elem2 in $1 { 
       x.append(elem1 + [elem2]) 
      } 
     } 
     return x 
    } 
} 

let multi = [[1,2,3,4,5],[1,2,3,4,5,6,7,8,9,0]] 
combinations(of: multi) // [[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [1, 9], [1, 0], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [2, 8], [2, 9], [2, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [3, 8], [3, 9], [3, 0], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [4, 8], [4, 9], [4, 0], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [5, 8], [5, 9], [5, 0]] 
+0

那么,它变得非常简单) – Anton

0

你也可以做到这一点没有任何for循环:

func combinations<T>(of array: [[T]]) -> [[T]] 
{ 
    return array.reduce([[]]){ c,a in c.flatMap{ e in a.map{e + [$0] } } } 
}