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

尝试将切片作为参数传递给递归函数 (Go) 时,切片超出范围

尝试将切片作为参数传递给递归函数 (Go) 时,切片超出范围

Go
叮当猫咪 2022-01-17 18:43:34
我正在尝试将切片作为参数传递给递归函数。由于切片作为参考传递,我相信我传递给它的递归函数应该能够毫无问题地执行操作。我只使用 append() ,因此不应该对容量不足的切片有问题吗?package mainimport "fmt"func allPossiblePaths(arrGraph [8][8]bool, src int, dest int) [][]int {    var visited []bool //a slice that marks if visited    var path []int     //a slice to store a possible path    var paths [][]int  //a slice to store all paths    visited = make([]bool, 8) //set all nodes to unvisited    dfs(arrGraph, src, dest, visited, path, paths)    return paths}func dfs(myGraph [8][8]bool, src int, dest int, visited []bool, path []int, paths [][]int) {    //add current node to path    path = append(path, src)    //mark current node as visited    visited[src] = true    //if the current node is the destination    //print the path and return    if src == dest {        //make a copy of path slice        buffer := make([]int, len(path))        copy(buffer, path)        //append the copy of path slice into the slice of paths        paths = append(paths, buffer)        fmt.Println(path) //Just for debugging purpose        return    }    for i := 1; i <= 7; i++ { //loop through all nodes        //if ith node is a neighbour of the current node and it is not visited        if myGraph[src][i] && visited[i] == false {            // call dfs on the current node            dfs(myGraph, i, dest, visited, path, paths)            //mark the current node as unvisited            //so that we can other paths to the final destination            visited[i] = false            //re-slice the slice - get rid of the current node            path = path[:len(path)-1]        }    }}预期输出:(在使用全局变量而不是将变量传递给函数时实现)[[1 2 3 4 6 7] [1 2 3 6 7] [1 2 5 6 7] [1 3 2 5 6 7] [1 3 4 6 7] [1 3 6 7] [1 6 7]]知道我做错了什么吗?
查看完整描述

2 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

错误消息准确地说明了问题所在:


恐慌:运行时错误:切片超出范围


由于您正在迭代调用相同的函数并重新切片切片,因此您每次都需要检查是否达到切片容量范围,换句话说,如果切片指针指向有效地址(索引),否则您会收到out of range error消息.


而且由于您正在进行递归迭代,因此每次通过减小路径长度,您必须检查切片索引是否在有效范围内。


//re-slice the slice - get rid of the current node

if len(path) > 0 {

       path = path[:len(path)-1]

}

https://play.golang.org/p/pX2TlAP-bp


查看完整回答
反对 回复 2022-01-17
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

我通过使用指向我的切片“路径”的指针作为递归函数的参数来解决它。现在可以了!不管怎么说,还是要谢谢你。


package main


import "fmt"


func allPossiblePaths(arrGraph [8][8]bool, src int, dest int) [][]int {

    var visited []bool //a slice that marks if visited

    var path []int     //a slice to store a possible path

    var paths [][]int  //a slice to store all paths


    visited = make([]bool, 8) //set all nodes to unvisited


    dfs(arrGraph, src, dest, visited, &path, paths)


    return paths


}


func dfs(myGraph [8][8]bool, src int, dest int, visited []bool, path *[]int, paths [][]int) {

    //add current node to path

    *path = append(*path, src)


    //mark current node as visited

    visited[src] = true


    //if the current node is the destination

    //print the path and return

    if src == dest {


        //make a copy of path slice

        buffer := make([]int, len(*path))

        copy(buffer, *path)


        //append the copy of path slice into the slice of paths

        paths = append(paths, buffer)


        fmt.Println(*path) //Just for debugging purpose

        return

    }


    for i := 1; i <= 7; i++ { //loop through all nodes


        //if ith node is a neighbour of the current node and it is not visited

        if myGraph[src][i] && visited[i] == false {


            // call dfs on the current node

            dfs(myGraph, i, dest, visited, path, paths)


            //mark the current node as unvisited

            //so that we can other paths to the final destination

            visited[i] = false


            //re-slice the slice - get rid of the current node


            *path = (*path)[:len(*path)-1]


            //fmt.Println(path)


        }


    }


}


func main() {

    var myGraph [8][8]bool //the graph


    //creating the graph

    myGraph[1] = [...]bool{false, false, true, true, false, false, true, false}

    myGraph[2] = [...]bool{false, true, false, true, false, true, false, false}

    myGraph[3] = [...]bool{false, true, true, false, true, false, true, false}

    myGraph[4] = [...]bool{false, false, false, true, false, false, true, false}

    myGraph[5] = [...]bool{false, false, true, false, false, false, true, false}

    myGraph[6] = [...]bool{false, true, false, true, true, false, false, true}

    myGraph[7] = [...]bool{false, false, false, false, false, false, true, false}


    fmt.Println(allPossiblePaths(myGraph, 1, 7))

}


查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 185 浏览
慕课专栏
更多

添加回答

举报

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