gpt4 book ai didi

go - 在 slice 上运行递归函数时发生意外行为

转载 作者:行者123 更新时间:2023-12-01 22:15:34 30 4
gpt4 key购买 nike

在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, "")

它将输出:
102
210

但是,如果我在Go中做类似的事情,

package main

import "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, "")
}

输出为:
102
22

我猜这种行为是由于 slice 链接到Go上的下划线数组,但是我不知道如何以及如何调试它。

您能指出我的问题吗?

最佳答案

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

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

通过 copying the slice elements修复到新的支持数组:
    nx := append(([]int)(nil), ns[:i]...) // copy
nx = append(nx, ns[i+1:]...)

Run it on the playground

您也可以使用 full slice expression强制复制:
    nx := append(ns[0:i:i], ns[i+1:]...)

Run it on the playground

关于go - 在 slice 上运行递归函数时发生意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60556866/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com