当前位置: 首页 > 知识库问答 >
问题:

Swift泛型函数(n选k)

左恺
2023-03-14

我试图使这个JavaScript代码在Swift:k_combinations

到目前为止,我在斯威夫特有这样的记录:

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, 2, 3, 4], [2, 3, 3, 4], [3, 4, 4]]

当它应该打印的时候

[[1,2], [1,3], [2, 3]

我做错了什么?我不擅长编码,我的javascript技能也不是很好,但javascript对我来说很有用,但在swift中我无法做到这一点。

共有1个答案

花阳辉
2023-03-14

Swift翻译中的主要错误是对JavaScriptslice(start,end)方法的误解:该方法返回具有从给定开始索引到但不包括给定结束索引的索引的元素。您的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]

另一个错误是(可能已经存在于JavaScript代码中),对于k==0,您必须返回[[]],即包含空选择的数组,而不是[]。事实上,这是唯一需要特别处理的案件。递归自动正确处理所有其他情况。

最后,在一般情况下,您必须从一个空数组开始:

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
}

一些评论:

  • [T]数组的简写符号

 类似资料:
  • Swift 4语言提供了泛型()功能来编写灵活且可重用的函数和类型。 泛型用于避免重复并提供抽象。 Swift 4标准库使用泛型代码构建。 Swift 4中的数组和字典类型属于泛型集合。 使用数组和字典,数组可定义为保存值和值或任何其他类型。 示例代码 当使用playground运行上述程序时,得到以下结果 - 泛型函数:类型参数 泛型函数可用于访问任何数据类型,如或。 当使用playground

  • Swift 提供了泛型让你写出灵活且可重用的函数和类型。 Swift 标准库是通过泛型代码构建出来的。 Swift 的数组和字典类型都是泛型集。 你可以创建一个Int数组,也可创建一个String数组,或者甚至于可以是任何其他 Swift 的类型数据数组。 以下实例是一个非泛型函数 exchange 用来交换两个 Int 值: 实例// 定义一个交换两个变量的函数 func swapTwoInts

  • 同样的规则也可以适用于函数:在使用前给出 <T> 后,类型 T 就变成了泛型。 使用泛型函数有时需要显式地指明类型参量。这种可能的情况包括,调用返回类型是泛型的函数,或者编译器没有足够的信息来推导类型参量。 函数调用使用显式指定的类型参量,如下所示: fun::<A, B, ...>(). struct A; // 具体类型 `A`。 struct S(A); //

  • 问题内容: 我一直在研究具有不同类型的泛型类的数组。用一些示例代码来解释我的问题是最简单的: 现在,如果我尝试创建像这样的容器数组: 我得到错误: 协议“ MyProtocol”只能用作通用约束,因为它具有“自身”或相关的类型要求。 要解决这个问题,我可以使用: 但是现在在枚举时出现了另一个“问题” : 如您在上面的代码中看到的那样,在两种情况下,确定相同方法的类型后都会调用它。我的问题是: 是否

  • 泛型函数定义 泛型函数可以用于任何类型. 这里是上面提到的swapTwoInts(_:, _:)函数的泛型版本, 叫做swapTwoValues(_:_:) func swapTwoValues<T>(_ a: inout T, _ b: inout T) { let temporaryA = a a = b b = temporaryA } 上面的s

  • 问题内容: 现在,我希望能够查看so中是否包含对象: 如果您发现此功能属于扩展名。问题是如果将其添加到此: 我收到以下错误: 找不到’==’的重载,该重载接受提供的参数 我了解我可能需要告诉什么样的对象应该在里面,例如:。但这还不起作用: 括号中的语句块是未使用的闭包 非标称类型’T []’无法 扩展 问题答案: 使用Swift时,我们需要考虑是否有一个 函数 可以解决问题-在类的方法之外。 就像