golang 二维 slice 的奇怪 bug

对二维 slice 操作时,对长度 16 的 slice 的第 8 次操作时,影响了第 16 个 slice 的最后一个元素。。

package main

import "fmt"
// import "sort"
// import "reflect"
// import "math"
// import "strings"

func showSlice(s [][]int) {
    for _, v := range s {
        fmt.Println(v)
    }
    fmt.Println()
}

func main() {
    fmt.Println(subsets([]int{9,0,3,5,7}))
}

func subsets(nums []int) [][]int {
    ret := [][]int{{}}
    for i := 0; i < len(nums); i++ {
        tmp := make([][]int, len(ret))
        copy(tmp, ret)
        if len(ret) == 16 {
            fmt.Println(tmp[15])
        }
        for j := 0; j < len(tmp); j++ {
            if len(ret) == 16 {
                fmt.Println(j, tmp[15])
            }
            fmt.Println(j, tmp[j])
            tmp[j] = append(tmp[j], nums[i])
            fmt.Println("\t", nums[i], "~~~", tmp[j])
        }
        if len(ret) == 16 {
            fmt.Println(tmp[15])
        }
        ret = append(ret, tmp...)
    }
    return ret
}
4 [3]
	 7 ~~~ [3 7]
5 [9 0 3 5]
5 [9 3]
	 7 ~~~ [9 3 7]
6 [9 0 3 5]
6 [0 3]
	 7 ~~~ [0 3 7]
7 [9 0 3 5]
7 [9 0 3]
	 7 ~~~ [9 0 3 7]
8 [9 0 3 7]				-> 这里变化了
8 [5]
	 7 ~~~ [5 7]
9 [9 0 3 7]
9 [9 5]
	 7 ~~~ [9 5 7]
10 [9 0 3 7]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值