append元素时明明没append某个元素,不知道为什么结果里有

大家好,非常感谢能抽出百忙的时间看小弟这样一个问题
我在用golang刷leetcode 39题时遇到一个问题(和算法没关系)

大概是 a=append(a,b),我打出了b,但是a里出现了不是b的元素

package main

import (
    "fmt"
)

var res [][]int //保存被递归函数append的结果

func CombinationSum(candidates []int, target int) [][]int {
    var steps []int
    combile(candidates, steps, target, 0)
    return res
}

func combile(nums []int, steps []int, target int, index int) {
    if target < 0 {
        return
    }
    if target == 0 {
        fmt.Println("steps=", steps)//要append进去的元素
        res = append(res, steps)
        return
    }
    length := len(nums)
    for i := index; i < length; i++ {
        num := nums[i]
        steps_ := append(steps, num)
        target_ := target - num
        if target_ < 0 {
            break
        }
        combile(nums, steps_, target_, i)
    }
}
func main() {
    nums := []int{2, 3, 5, 7}
    target := 8
    res := CombinationSum(nums, target)
    fmt.Println(res)
}

结果是

steps= [2 2 2 2]
steps= [2 3 3]
steps= [3 5]
[[2 2 2 3] [2 3 3] [3 5]]

我第一个append进去的明明是[2,2,2,2]
不知道为什么会变成[2,2,2,3]

不知道res在哪个地方被修改了,能修改的也就只有打印steps的那个地方

最佳答案

1 .如果追加数组进另一个数组里,记得解包

a := make([]int,10)
b := make([]int,2)

a = append(a,b...)
  1. 如果只是想得出一个结果,最好复制一个新切片保存结果,避免因append时发生扩容,导致地址更改.
3年前 评论
hkuicode (楼主) 3年前
讨论数量: 2

append之前需要把steps复制一份

tmp:=make([]int,len(steps))
copy(tmp,steps)
res=append(res, tmp)

这样才行

3年前 评论

1 .如果追加数组进另一个数组里,记得解包

a := make([]int,10)
b := make([]int,2)

a = append(a,b...)
  1. 如果只是想得出一个结果,最好复制一个新切片保存结果,避免因append时发生扩容,导致地址更改.
3年前 评论
hkuicode (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!