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

问题描述 投票:0回答:1

[使用Python背景学习Golang。在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

但是,如果我用golang做类似的事情,

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

我猜这种现象是由于切片链接到golang上的下划线数组,但我不知道如何以及如何调试它。

您能指出我的问题吗?

go recursion slice
1个回答
0
投票

此行代码修改了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

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.