我希望能夠在 Swift中生成給定大小的Bool(true/false或) 的所有可能排列的陣列。例如,給定呼叫的結果是1/0nn=2generate(2)
let array: [Bool] = generate(2) // [[false, false], [false, true], [true, false], [true, true]]
我查看了 Swift 演算法,但我看到的只是提供的元素陣列的排列和組合。這些演算法似乎無法解決Boolwith的場景n>2。另外,我不確定該演算法的名稱是什么。
uj5u.com熱心網友回復:
只是為了好玩一種功能方法:
extension RangeReplaceableCollection {
var combinations: [Self] { generate(2) }
func generate(_ n: Int) -> [Self] {
repeatElement(self, count: n).reduce([.init()]) { result, element in
result.flatMap { elements in
element.map { elements CollectionOfOne($0) }
}
}
}
}
用法:
let elements = [false, true] // [false, true]
let combinations = elements.combinations // [[false, false], [false, true], [true, false], [true, true]]
let generateThree = elements.generate(3) // [[false, false, false], [false, false, true], [false, true, false], [false, true, true], [true, false, false], [true, false, true], [true, true, false], [true, true, true]]
要么
let elements = [0, 1] // [0, 1]
let combinations = elements.combinations // [[0, 0], [0, 1], [1, 0], [1, 1]]
let generateThree = elements.generate(3) // [0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]
或使用字串(字符集合):
let elements = "01" // "01"
let combinations = elements.combinations // ["00", "01", "10", "11"]
let generateThree = elements.generate(3) // ["000", "001", "010", "011", "100", "101", "110", "111"]
uj5u.com熱心網友回復:
這是一個簡單的遞回實作:
import Foundation
func recursion(depth: Int, arr: [[Bool]]) -> [[Bool]] {
if depth == .zero {
return arr
}
var newArr: [[Bool]] = []
for item in arr {
let newItem1 = item [false]
let newItem2 = item [true]
newArr = [newItem1, newItem2]
}
return recursion(depth: depth-1, arr: newArr)
}
print(recursion(depth: 1, arr: [[]]))
print(recursion(depth: 2, arr: [[]]))
print(recursion(depth: 3, arr: [[]]))
這給出了輸出:
[[false], [true]]
[[false, false], [false, true], [true, false], [true, true]]
[[false, false, false], [false, false, true], [false, true, false], [false, true, true], [true, false, false], [true, false, true], [true, true, false], [true, true, true]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/427952.html
下一篇:如何在函式中呼叫帶引數的閉包
