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

在 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

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


你能指出我的问题吗?


幕布斯7119047
浏览 103回答 1
1回答

米琪卡哇伊

这行代码修改了 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:]...)在操场上运行它。
打开App,查看更多内容
随时随地看视频慕课网APP