Javascript 如何用Swift编写这个递归函数?
我有一个递归函数,可以在JavaScript中正常工作: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
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
}