在刷题的时候,有时候写dfs,我总喜欢拼凑切片,但是在debug的时候发现,这就引起了我的好奇心,为什么我会出错,错在哪里?
见下,我的目标是
func main() {
cnt := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
errDemoDfs(cnt)
}
func errDemoDfs(cnt []int) {
for i := 0; i < len(cnt); i++ {
nextCnt := make([]int, len(cnt)-1)
copy(nextCnt, cnt[:i])
copy(nextCnt, cnt[i+1:])
fmt.Println(nextCnt)
errDemoDfs(nextCnt)
}
}
...
[2 3 4 5 6 7 8 9]
[3 4 5 6 7 8 9 0]
[4 5 6 7 8 9 0 0]
[5 6 7 8 9 0 0 0]
[0 0]
[0]
[]
....
错误原因
看输出发现,怎么新切片末尾是0,和我预取的结果不一致啊,why?随后debug
发现原切片,cnt[:i],cnt[i+1:],都是正常的。恍然大悟!原来是我copy用错了
copy的用法:
1. copy(dst,src)
2. 拷贝min(len(dst),len(src))个元素
看第三个步骤,每次都从下标0开始赋值,也就是说
copy(nextCnt, cnt[:i])
copy(nextCnt, cnt[i+1:])
cnt[i+1:]的元素覆盖了cnt[:i]
有时候深拷贝切片我会用copy,然后遇到想要去除一个元素的情况,我偷懒也用copy,这就导致bug出现了
正常用法那么如果想要深拷贝,并且去除原数组的一个元素该如何写呢
func main() {
cnt := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
acDemoDfs(cnt)
}
func acDemoDfs(cnt []int) {
for i := 0; i < len(cnt); i++ {
nextCnt := make([]int, 0, len(cnt)-1)
nextCnt = append(nextCnt, cnt[:i]...)
nextCnt = append(nextCnt, cnt[i+1:]...)
fmt.Println(nextCnt)
acDemoDfs(nextCnt)
}
}