Javascript 如何用Swift编写这个递归函数?

Javascript 如何用Swift编写这个递归函数?,javascript,swift,recursion,Javascript,Swift,Recursion,我有一个递归函数,可以在JavaScript中正常工作: var distributeSpacings=函数(cols,maxspacting){ if(cols==1){ 返回[maxSpacing]; } var结果=[]; 对于(变量i=0;i[元素]{ 如果让u=添加为?Int{ 返回self+([添加为!元素]) }否则{ 返回self+(添加为![元素]) } } } func置换空间(列:Int,最大间距:Int)->Any{ 如果列==1{ 返回[maxSpacing] } va

我有一个递归函数,可以在JavaScript中正常工作:

var distributeSpacings=函数(cols,maxspacting){
if(cols==1){
返回[maxSpacing];
}
var结果=[];
对于(变量i=0;i[元素]{
如果让u=添加为?Int{
返回self+([添加为!元素])
}否则{
返回self+(添加为![元素])
}
}
}
func置换空间(列:Int,最大间距:Int)->Any{
如果列==1{
返回[maxSpacing]
}
var结果=[任何]()

对于(var i=0;i,因此我设法通过少量调整修复了您的函数

第一个问题是您的函数返回了
Any
,而不是
[Any]
。然后您将
Any
强制转换为
[Int]
,然后发生了崩溃。第二个问题是您隐式地将
强制转换为!
而不使用
保护
/
如果让
(在它可能崩溃的地方,在这里它肯定会崩溃),而且你真的不需要这个演员。第三个问题是:

var subSpacings = permutateSpacings(columns - 1, maxSpacing: maxSpacing - 1)
您有
1
而不是所需的
i
(来自您的JS算法)。工作功能如下:

extension Array {
    func concat(toAdd: Any) -> [Element] {
        if let _ = toAdd as? Int {
            return self + ([toAdd as! Element])
        } else {
            return self + (toAdd as! [Element])
        }
    }
}

func permutateSpacings (columns: Int, maxSpacing: Int) -> [Any] {
    if columns == 1 {
        return [maxSpacing]
    }

    var results = [Any]()

    for (var i = 0; i <= maxSpacing; i++) {
        var subSpacings = permutateSpacings(columns - 1, maxSpacing: maxSpacing - i)
        for (var j = 0; j < subSpacings.count; j++) {
            let subSpacing = subSpacings[j]
            results.append([i].concat(subSpacing))
        }
    }
    return results
}

print(permutateSpacings(3, maxSpacing: 3))
扩展数组{
func concat(toAdd:Any)->[元素]{
如果让u=添加为?Int{
返回self+([添加为!元素])
}否则{
返回self+(添加为![元素])
}
}
}
func置换空间(列:Int,最大间距:Int)->[任何]{
如果列==1{
返回[maxSpacing]
}
var结果=[任何]()

对于(var i=0;i,感谢sunshine找到了
1
->
i
。我得到了一个不同的结果,并认为我弄乱了算法


不需要阵列扩展,但应正确编写,如下所示:

extension Array {
    func concat(toAdd: [Element]) -> [Element] {
        return self + toAdd
    }
    func concat(toAdd: Element) -> [Element] {
        return self + [toAdd]
    }
}

根本不需要
任何
。类型总是已知的

用于0中的间距…maxSpacing
用于子间距中的子间距
用于迭代的更快速语法

func permutateSpacings(columns: Int, maxSpacing: Int) -> [[Int]] {
    if columns == 1 {
        return [[maxSpacing]]
    }

    var results : [[Int]] = [] // var/let : Type = Value

    for spacing in 0...maxSpacing {
        let subSpacings = permutateSpacings(columns - 1, maxSpacing: maxSpacing - spacing)
        for subSpacing in subSpacings {
            results.append(([spacing] + subSpacing))
        }
    }
    return results
}
func permutateSpacings(columns: Int, maxSpacing: Int) -> [[Int]] {
    if columns == 1 {
        return [[maxSpacing]]
    }

    var results : [[Int]] = [] // var/let : Type = Value

    for spacing in 0...maxSpacing {
        let subSpacings = permutateSpacings(columns - 1, maxSpacing: maxSpacing - spacing)
        for subSpacing in subSpacings {
            results.append(([spacing] + subSpacing))
        }
    }
    return results
}