V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
an93
V2EX  ›  问与答

golang 求助大佬

  •  
  •   an93 · Nov 7, 2020 · 1661 views
    This topic created in 2000 days ago, the information mentioned may be changed or developed.

    import "fmt"

    func main() {
        input := []int{2,3, 5}
        target := 8
        fmt.Println(combinationSum(input, target))
    
    }
    
    func combinationSum(candidates []int, target int) [][]int {
       var res [][]int
    
       var backtrack func(int, int, []int)
       backtrack = func(idx int, sum int, nums []int) {
    
           if sum == target {
               res = append(res, nums)
           }
           if sum >= target {
               return
           }
           for i := idx; i < len(candidates); i++ {
               backtrack(i, sum + candidates[i], append(nums,candidates[i]))
           }
       }
       backtrack(0, 0, []int{})
       return res
    }
    

    这段代码结果有问题, 而且问题处在 res = append(res, nums) 这一行, 如果我把 nums copy 一个再 append 就不会有问题了,听说这里大神比较多,求大神们指教一下

    3 replies    2020-11-08 07:39:49 +08:00
    an93
        1
    an93  
    OP
       Nov 7, 2020
    awah
        2
    awah  
       Nov 7, 2020
    slice 是指针传递
    zhouenxian
        3
    zhouenxian  
       Nov 8, 2020
    函数传参数确实是值传递,但 slice 传递的值中包含了内容的地址,所以还是把地址传了进去。
    如下为切片类型的内部定义。
    type _slice struct {
    elements unsafe.Pointer // 引用着底层存储在间接部分上的元素
    len int // 长度
    cap int // 容量
    }
    引用:go 101,https://gfw.go101.org/article/container.html
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2643 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 03:15 · PVG 11:15 · LAX 20:15 · JFK 23:15
    ♥ Do have faith in what you're doing.