go - 递归附加到 slice 不起作用

标签 go

我正在尝试学习 Go,但我不明白为什么递归调用堆栈末尾的这段代码返回一个空 slice ,有帮助吗?此外,tmp 似乎甚至没有在调试器中注册。

func main() {
    input := [3]int{4, 6, 7}
    // expected [[6,7],[4,6,7],[4,6],[4,7]]
    fmt.Println(findSubsequences(input))
}

func findSubsequences(nums [3]int) [][]int {
    res := [][]int{}
    list := []int{}
    findSubsequence(res, list, nums, 0)
    return res
}

func findSubsequence(res [][]int, list []int, nums [3]int, id int) [][]int {
    if len(list) > 1 {
        tmp := make([]int, len(list))
        copy(tmp, list)
        res = append(res, tmp)
    }
    var unique []int
    for i := id; i < len(nums); i++ {
        if id > 0 && nums[i] < nums[id-1] {
            continue // skip non-increase
        }
        if contains(unique, nums[i]) {
            continue // skip duplicate
        }
        unique = append(unique, nums[i])
        list = append(list, nums[i])
        findSubsequence(res, list, nums, id+1)
        list = list[:len(list)-1]
    }
    return res
}

func contains(s []int, e int) bool {
    for _, a := range s {
        if a == e {
            return true
        }
    }
    return false
}

最佳答案

这是让您的代码附加 slice 的解决方案。在 GO 中,如果递归传递 slice ,则必须通过引用传递它。因此,这解决了您遇到的代码将返回空 slice 的问题。但是您的算法似乎不符合您期望的结果。

func main() {
    input := [3]int{4, 6, 7}
    // expected [[6,7],[4,6,7],[4,6],[4,7]]
    fmt.Println(findSubsequences(input))
}

func findSubsequences(nums [3]int) [][]int {
    res := [][]int{}
    list := []int{}
    fmt.Print(nums)
    findSubsequence(&res, list, nums, 0)
    return res
}

func findSubsequence(res *[][]int, list []int, nums [3]int, id int) [][]int {
    var tmp []int
    if len(list) > 1 {
        tmp = make([]int, len(list))
        copy(tmp, list)
    fmt.Println(tmp)
        *res = append(*res, tmp)
    }
    var unique []int
    for i := id; i < len(nums); i++ {
        if id > 0 && nums[i] < nums[id-1] {
            continue // skip non-increase
        }
        if contains(unique, nums[i]) {
            continue // skip duplicate
        }
        unique = append(unique, nums[i])
        list = append(list, nums[i])
        findSubsequence(res, list, nums, id+1)
    list = list[:len(list)-1]

    }
    return *res
}

func contains(s []int, e int) bool {
    for _, a := range s {
        if a == e || a >e {
            return true
        }
    }
    return false
}

关于go - 递归附加到 slice 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45879903/

相关文章:

html - 如何使用 Go 修改 HTML 文件的元素?

json - AppEngine Go 应用程序中的奇怪行为

docker - 具有外部包依赖性的 Golang 测试未通过 Gitlab Ci,但通过本地

go - 带结构的循环导入

go - 从 slice 中删除多个项目

tensorflow - 在项目中使用go模块时如何导入tensorflow go包?

go - 在 go 结构中使用空结构作为字段的目的是什么?

mysql - 无法使用 *DB.Rows() 获取所有行

go - 设置 Martini 日志路径

c# - 用 'Floating Point Numbers' 绘制图像