【问题标题】:Golang permutations of numbers, recursion not workingGolang数字排列,递归不起作用
【发布时间】:2021-12-31 12:29:25
【问题描述】:

代码如下:

package main

import "fmt"

func anon(n []int, sl []int, result [][]int) {
    if len(n) == 0 {
        result = append(result, sl)
        fmt.Printf("result %v\n", result)
        return
    }
    for i , _ := range n {
        fmt.Printf(" n %v\n", n)
        sl = append(sl, n[i])
        ab := append(n[:i], n[i+1:]...)
        fmt.Printf("i %v ---ab %v, sl %v, result %v ---\n",i, ab,sl,result )

        anon(ab, sl , result)
    }
}

func permute(nums []int) [][]int {
    var sl1 = []int{}
    var result = [][]int{}
    anon(nums, sl1, result)
 return result
}

func main() {
  sl2 := []int{1,2}
  permute(sl2)
  
}

我期待“结果”为 [[1,2], [2,1]]。但是,当我查看代码运行的以下输出时:

 n [1 2]
i 0 ---ab [2], sl [1], result [] ---
 n [2]
i 0 ---ab [], sl [1 2], result [] ---
result [[1 2]]

n [2 2]

i 1 ---ab [2],sl [1 2],结果 [] ---

 n [2]
i 0 ---ab [], sl [1 2 2], result [] ---
result [[1 2 2]]

我看到(粗体)i=1,我有 ab[2]、sl[1 2]、result[] 和 n[2,2]。我无法让它为 Golang 工作。类似的东西也适用于 Python。

感谢您的回答。

【问题讨论】:

    标签: go recursion permutation


    【解决方案1】:

    查看此完整示例,它可以帮助您更好地了解如何使用golanghttps://go.dev/play/p/JKG_FtilQCz 进行排列。

    在 Golang 中,切片是指向数组的指针,当您创建 append(n[:i], n[i+1:]...) 时,您将在变量 n 中添加一个新值,因此您正在更改初始 sl2 值,应该是 {1,2} 但是如您所述,已转换为 {2,2}。尽量不要追加n,而是追加ab或其他。

    【讨论】:

    • 感谢@ronaldo 的快速回答。切片和递归一起造成了一些混乱。在您发表评论后,我采取了更接近并能够解决它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 2018-07-14
    • 2014-08-19
    • 2016-12-10
    • 2019-02-13
    • 1970-01-01
    相关资源
    最近更新 更多