【问题标题】:Heaps algorithm in swift快速堆算法
【发布时间】:2019-03-19 10:17:30
【问题描述】:

我在 Swift 中有一个堆算法的实现,我试图将其转换为不使用 inout 参数。

但是我得到了不同的结果(第二个是错误的,提供了重复的排列)。出了什么问题,我该如何解决?

原始实现:

func permutations(_ n:Int, _ a: inout Array<Character>) {
    if n == 1 {print(String(a)); return}
    for i in 0..<n-1 {
        permutations(n-1,&a)
        a.swapAt(n-1, (n%2 == 1) ? 0 : i)
    }
    permutations(n-1,&a)
}
var arr = Array("ABC".characters)
permutations(arr.count,&arr)

输出:ABC BAC CAB ACB BCA CBA

不带inout参数的实现:

func permutations (_ n: Int, _ a: Array<Character>) {
    var ary = a
    if (n == 1){
        print(String(ary));
        return
    }
    for i in 0..<n-1 {
        permutations(n-1, ary)
        ary.swapAt(n-1, (n%2 == 1) ? 0 : i)
    }
    permutations(n-1, ary)
}
var arr = Array("ABC".characters)
permutations(arr.count,arr)

输出:

输出:ABC BAC CBA BCA ABC BAC

请注意,我们在此输出中没有得到 CAB,并且还重复了“BAC”和“ABC”。

我不太明白这两者是如何不等价的,我想创建一个不带 inout 参数的算法版本。

【问题讨论】:

  • 在你的第二个函数的日志中,你从哪里得到outputArray?你的第二个函数有返回值吗?
  • 糟糕,失误了。两者是等价的,都什么都不返回。
  • Arraystruct 并在 Swift 中按值传递。如果不使用inout,则必须返回数组才能接收更改。在不更新数组的情况下,for 循环中的每个 permutations(n-1, ary) 在交换之前基本上什么都不做。
  • 是否可以使用签名 func permutations (_ n: Int, _ a: Array) -> [String]

标签: swift heaps-algorithm


【解决方案1】:

Arraystruct 并在 Swift 中按值传递。如果不使用 inout,则必须返回数组才能接收更改。在不更新数组的情况下,for 循环中的每个 permutations(n-1, ary) 在交换之前基本上什么都不做。

func permutations (_ n: Int, _ a: Array<Character>) -> Array<Character> {
    var ary = a
    if (n == 1){
        print(String(ary));
        return ary
    }
    for i in 0..<n-1 {
        ary = permutations(n-1, ary)
        ary.swapAt(n-1, (n%2 == 1) ? 0 : i)
    }
    return permutations(n-1, ary)
}

【讨论】:

    【解决方案2】:

    试试这样的

    func permutations (_ n: Int, _ a: Array<Character>) -> Array<Character> {
        var ary = a
        if (n == 1){
            print(String(ary));
            return ary
        }
        var array = Array<Character>()
        for i in 0..<n-1 {
            array = i == 0 ? permutations(n-1, ary) : permutations(n-1, array)
            array.swapAt(n-1, (n%2 == 1) ? 0 : i)
        }
        return permutations(n-1, array)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-12
      • 2012-05-30
      • 1970-01-01
      • 2015-07-12
      • 2011-09-05
      • 2010-11-01
      • 2011-03-23
      • 2011-08-27
      相关资源
      最近更新 更多