为了账号安全,请及时绑定邮箱和手机立即绑定

在切片上运行递归函数时出现意外行为

在切片上运行递归函数时出现意外行为

Go
幕布斯7119047 2022-05-18 16:58:25
在 Python 中,我可以进行递归,例如:def dfs(a, path):    if len(a) == 0:        print(path)        return    for i in range(len(a)):        dfs(a[:i]+a[i+1:], path+str(a[i]))if __name__ == "__main__":    a = [10, 2]    dfs(a, "")它将输出:102210但是,如果我在 Go 中做类似的事情,package mainimport "fmt"func dfs(ns []int, path string) {    if len(ns) == 0 {        fmt.Println(path)        return    }    for i, v := range ns {        nx := append(ns[:i], ns[i+1:]...)        dfs(nx, fmt.Sprintf("%v%v", path, v))    }}func main() {    nums := []int{10, 2}    dfs(nums, "")}输出将是:10222我猜这种行为是由于切片链接到 Go 上的下划线数组,但我不明白如何以及如何调试它。你能指出我的问题吗?
查看完整描述

1 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

这行代码修改了 ns 的后备数组:

    nx := append(ns[:i], ns[i+1:]...)

通过将切片元素复制到新的支持数组来修复:

    nx := append(([]int)(nil), ns[:i]...) // copy
    nx = append(nx, ns[i+1:]...)

在操场上运行它

您还可以使用完整的切片表达式强制复制:

    nx := append(ns[0:i:i], ns[i+1:]...)

在操场上运行它


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信