提问人:ozzy 提问时间:10/25/2023 最后编辑:ozzy 更新时间:10/26/2023 访问量:27
在 Go 中使用共享“临时”切片的排列生成代码在输入大小小于 3 时表现出意外行为
Permutation generation code in Go using a shared 'temp' slice exhibits unexpected behavior with input sizes less than 3
问:
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] 起作用
答: 暂无答案
下一个:如何取消引用切片引用
评论