Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics Swift通用函数(n选择k)_Generics_Swift_Combinations - Fatal编程技术网

Generics Swift通用函数(n选择k)

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 {

我试图用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 {
        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
}