我在Swift Playgrounds中构建了这个代码示例,作为我正在进行的一个更大项目的一部分的概念证明。我需要做的是传入一系列选项(由optionsrarray或testArray表示),其中每个int是可用选项的数量。这些选项最终将被构建到3亿多个独立的pdf和HTML文件中。这段代码目前可以工作,并列出了我希望它能够工作的巨大可能性列表。
我的问题是:有没有更好的方法来处理这种情况?有更优雅或更高效的东西吗?这不是在应用程序或任何东西上实时运行的东西,它将从命令行运行并占用它所需的所有时间,但是如果有更好的性能或稳定性方法,我会全神贯注。
我已经知道:它不能处理数组中0的值。数组是一个常数,所以不会偶然发生。代码处理事情的方式是,0是一个不合理的值。每个元素表示可用选项的数量,因此2本质上是一个布尔值,1仅为false。因此,如果我需要占位符元素用于将来的扩展,它们的值将为1,并在输出中显示为0。
另外,最终的产品不仅仅是将文本作为输出barf到控制台,它还将基于permutationEnding()数组在currentOptions函数中写入一个文件。

let optionsArray: [Int] = [7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2]
let testArray: [Int] = [7,2,3,2]
var currentOptions: [Int] = []
var outputString: String = ""
func buildPermutations(array: Array<Int>) {
    currentOptions.removeAll()
    permutationRecursion(array: array, index: 0)
}
func permutationRecursion(array: Array<Int>, index: Int) {
    for i in 1 ... array[index] {
        currentOptions.append(Int(i-1))
        if array.count > (index + 1) {
            permutationRecursion(array: array, index: index + 1)
        } else {
            permutationEnding()
        }
        currentOptions.removeLast()
    }
}
func permutationEnding() {
    for i in 1 ... currentOptions.count { // Output Elements
        outputString += String(currentOptions[i-1])
    }
    outputString += "\n" // Goes after output elements closing bracket.
}
// buildPermutations(array: optionsArray)
buildPermutations(array: testArray)
print(outputString)

思想?

最佳答案

我想我已经知道你想干什么了。您需要每个可能的整数组合的字符串输出,它可以映射决策树上所有可能的路由。
我把它降到了四五行。

let n = testArray.count // for readability
let products = ([Int](1...n)).map({testArray[$0..<n].reduce(1, *)})

// products is the cross product of element i + 1 to  element n of the array for all i in the array

let zipped = zip(testArray, products)

for i in 0..<testArray.reduce(1, *) { // this reduce is the cross product of the whole array

    let treePath = zipped.map(){ String(i / $0.1 % $0.0) }.joined()
    outputString += treePath + "\n"
}

还有一个编辑:我认为这可能会更快一些花哨的矩阵运算,如NumPy。我想知道加速框架是否能为您带来一些魔力,但我还没有使用它。
编辑:我很好奇,所以我用这个测试数组来计时
let testArray: [Int] = [7,2,2,2,2,2,2,3,2]

问题中的递归函数是:132.56s
这里的邮政地图是:14.44秒
当我向测试数组中添加元素时,它看起来是指数型的。

关于swift - 更好的递归方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41405361/

10-11 16:21