*res = append(*res, temp) 为什么要使用 temp 作为临时存储值
直接使用 *res = append(*res, nums)
而不使用 temp
复制当前排列会导致问题。
temp := make([]int, length)copy(temp, nums)*res = append(*res, temp)
问题分析
-
切片是引用类型:
- Go 中的切片(slice)是引用类型,它底层引用一个数组
- 当你将
nums
直接追加到res
时,你存储的是对底层数组的引用
-
交换操作的影响:
- 在后续的递归中,你会不断交换
nums
中的元素 - 这些交换会修改底层数组,从而影响之前已经添加到
res
的所有排列
- 在后续的递归中,你会不断交换
-
结果错误:
- 最终
res
中的所有排列都会指向同一个底层数组的最终状态 - 你会得到多个相同的排列(都是最后一次交换后的结果)
- 最终