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
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))
}
- 2 回答
- 0 关注
- 185 浏览
添加回答
举报