Когда элемент слайса описан в этом коде? - PullRequest
0 голосов
/ 23 декабря 2018

Я зарегистрировал каждый элемент, прежде чем добавить его.Но результат выглядит так, что какой-то элемент покрыт.

Я не знаю, когда он будет покрыт.

package main

import "fmt"

func main() {
    graph := [][]int{
        []int{3, 1},
        []int{4, 6, 7, 2, 5},
        []int{4, 6, 3},
        []int{6, 4},
        []int{7, 6, 5},
        []int{6},
        []int{7},
        []int{},
    }

    fmt.Println(allPathsSourceTarget(graph))
}

func allPathsSourceTarget(graph [][]int) [][]int {
    n := len(graph) - 1
    result := make([][]int, 0, 200)

    var pathRecord func(target, path []int)
    pathRecord = func(target, path []int) {
        if (len(target) == 0) && (path[len(path)-1] == n) {
            fmt.Println("insert into", path) // should end with 7
            result = append(result, path)
        }

        for _, v := range target {
            pathRecord(graph[v], append(path, v))
        }
    }

    for _, v := range graph[0] {
        pathRecord(graph[v], []int{0, v})
    }

    return result
}

Каждый элемент в результате должен заканчиваться на 7.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Это работает для меня.Я предполагаю, что это странно с append и ломтиками

Я предполагаю, что память, поддерживающая "this append", передается в рекурсивную функцию, так как слайс действует как указатель

Тогда в следующий разта же самая память, так что она перезаписывается

Так что вам нужно делать копии при каждой рекурсии, чтобы остановить ее перезапись

pathRecord = func(target, path []int) {
    if (len(target) == 0) && (path[len(path)-1] == n) {
        var c []int = make([]int, len(path))
        copy(c, path)
        //fmt.Println("insert into", payload) // should end with 7
        result = append(result, c)
    }

    for _, v := range target {
        pathRecord(graph[v], append(path, v)) //this append
    }
}
0 голосов
/ 23 декабря 2018

У вас проблема с этой строкой:

pathRecord(graph[v], append(path, v))

Go настолько «умный», что он пытается повторно использовать ту же выделенную память среза, и вы фактически изменяете путь, который вы уже добавили к результату.):

попробуйте вместо этого:

newPath = make([]int, len(path))
copy(newPath, path)
pathRecord(graph[v], append(newPath, v))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...