Generics Swift通用函数(n选择k)
我试图用Swift编写以下JavaScript代码: 到目前为止,我在斯威夫特有这样的记录:Generics Swift通用函数(n选择k),generics,swift,combinations,Generics,Swift,Combinations,我试图用Swift编写以下JavaScript代码: 到目前为止,我在斯威夫特有这样的记录: import Foundation import Cocoa extension Array { func slice(args: Int...) -> Array { var s = args[0] var e = self.count - 1 if args.count > 1 { e = args[1] } if e < 0 {
import Foundation
import Cocoa
extension Array {
func slice(args: Int...) -> Array {
var s = args[0]
var e = self.count - 1
if args.count > 1 { e = args[1] }
if e < 0 {
e += self.count
}
if s < 0 {
s += self.count
}
let count = (s < e ? e-s : s-e)+1
let inc = s < e ? 1 : -1
var ret = Array()
var idx = s
for var i=0;i<count;i++ {
ret.append(self[idx])
idx += inc
}
return ret
}
}
func kombinaatiot<T>(setti: Array<T>, k: Int) -> Array<Array<T>> {
var i: Int, j: Int
if (k > setti.count || k <= 0) {
return []
}
if (k == setti.count) {
return [setti]
}
if (k == 1) {
var combs: Array<T> = []
for var i = 0; i < setti.count; i++ {
combs += [setti[i]]
}
return [combs]
}
var combs: Array<Array<T>> = [[]]
for var i = 0; i < setti.count - k + 1; i++ {
var head = setti.slice(i,i + 1)
var tailcombs = kombinaatiot(setti.slice(i + 1), k - 1)
for var j = 0; j < tailcombs.count; j++ {
combs += ([head + tailcombs[j]])
}
}
println(combs)
return combs
}
什么时候该打印
[[1,2], [1,3], [2, 3]
我做错了什么?我不擅长编码,我的javascript技能也不是很好,但是javascript对我很有效,但在swift中我无法做到这一点。您的swift翻译中的主要错误是对javascript
片段(开始、结束)的误解
method:该方法返回具有从给定开始索引到的索引的元素,但不包括给定结束索引。您的Swift方法包括
结束索引,这是错误的
但Swift已经内置了带有订阅和范围语法的切片。例如:
let a = [0, 1, 2, 3]
let b = Array(a[1 ..< 3]) // from index 1 up to (but not including) 3
println(b) // [1, 2]
这提供了以下方法:
func kombinaatiot<T>(setti: [T], k: UInt) -> [[T]] {
if k == 0 {
return [[]]
}
var combs: [[T]] = []
for (i, head) in enumerate(setti) {
let tailcombs = kombinaatiot(Array(setti[i+1 ..< setti.count]), k - 1)
for tc in tailcombs {
combs += [[head] + tc]
}
}
return combs
}
func-kombinatiot(setti[T],k:UInt)->[[T]]{
如果k==0{
返回[]]
}
变量梳:[[T]]=[]
用于枚举(setti)中的(i,head){
设tailcombs=kombinatiot(数组(setti[i+1..
一些评论:
是[T]
的简写符号数组
- 我已将“C样式”循环替换为
for。。在更“快速”的循环中
参数声明为无符号整数k
var combs: Array<Array<T>> = [] // not [[]]
func kombinaatiot<T>(setti: [T], k: UInt) -> [[T]] {
if k == 0 {
return [[]]
}
var combs: [[T]] = []
for (i, head) in enumerate(setti) {
let tailcombs = kombinaatiot(Array(setti[i+1 ..< setti.count]), k - 1)
for tc in tailcombs {
combs += [[head] + tc]
}
}
return combs
}