在 Go 中使用共享“临时”切片的排列生成代码在输入大小小于 3 时表现出意外行为

Permutation generation code in Go using a shared 'temp' slice exhibits unexpected behavior with input sizes less than 3

提问人:ozzy 提问时间:10/25/2023 最后编辑:ozzy 更新时间:10/26/2023 访问量:27

问:

func permute(nums []int) [][]int {
    return gen(nums, [][]int{}, []int{}, make([]bool, len(nums)));
}

func gen(nums []int, res [][]int, temp []int, used []bool) [][]int {
    if len(nums) == len(temp) {
        //ctemp := make([]int, len(temp))
        //copy(ctemp, temp)
        return append(res, temp)
    } 
    for i := 0; i < len(nums); i++ {
        if !used[i] {
            used[i] = true
            temp = append(temp, nums[i])
            res = gen(nums, res, temp, used)
            temp = temp[:len(temp) - 1]
            used[i] = false
        }
    }
    return res
}

上述函数能够正确生成所有排列 当输入切片的长度为 1、2 或 3 时 但是当输入大小大于 3 时,1D 切片具有相同的值 因此,为了纠正此问题,我创建了 int 切片的副本,然后将其附加到 2D 结果切片

但是为什么上面的代码适用于小于 4 的输入大小 由于切片具有后备数组,因此在附加到 2D Res 切片后 对 Temp 1D 切片的任何修改都应反映在 2D 切片分辨率上 因为它指向相同的后备数组 为什么此行为不存在于大小为 2 和 3 的输入切片中?

输入 -> [1,2,3] 输出 -> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

输入 -> [5, 4,6,2] 输出 -> [[5,4,2,6],[5,4,2,6],[5,6,2,4],[5,6,2,4],[5,2,6,4],[5,2,6,4],[4,5,2,6],[4,5,2,6],[4,6,2,5],[4,6,2,5],[4,2,6,5],[4,2,6,5],[6,5,2,4],[6,5,2,4],[6,4,2,5],[6,4,2,5],[6,2,4,5],[2,5,6,4],[2,5,6,5],[2,4,6,5],[2,4,4,5],[2,6,4,5]]

为什么它对输入 [1,2,3] 起作用

数组 Go 内存管理 参考

评论

2赞 Volker 10/26/2023
它之所以有效,可能是因为一些随机容量的东西使它起作用。这里没什么可看的。只需修复代码即可。

答: 暂无答案