V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
an93
V2EX  ›  问与答

golang 求助大佬

  •  
  •   an93 · 2020-11-07 21:54:16 +08:00 · 1071 次点击
    这是一个创建于 1482 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 条回复    2020-11-08 07:39:49 +08:00
    an93
        1
    an93  
    OP
       2020-11-07 21:57:07 +08:00
    luguhu
        2
    luguhu  
       2020-11-07 22:28:41 +08:00
    slice 是指针传递
    zhouenxian
        3
    zhouenxian  
       2020-11-08 07:39:49 +08:00
    函数传参数确实是值传递,但 slice 传递的值中包含了内容的地址,所以还是把地址传了进去。
    如下为切片类型的内部定义。
    type _slice struct {
    elements unsafe.Pointer // 引用着底层存储在间接部分上的元素
    len int // 长度
    cap int // 容量
    }
    引用:go 101,https://gfw.go101.org/article/container.html
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2875 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 522ms · UTC 12:50 · PVG 20:50 · LAX 04:50 · JFK 07:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.