Ich versuche, ein Problem von der UVA Online-Richter Website zu lösen, insbesondere 539, wo ich ein DFS verwenden müssen, um den längsten Pfad zu finden, d kann es dringend lösen, aber ich möchte es auf eine funktionale idiomatische Art und Weise mit Hilfe von Scala tun, das Problem ist, dass, wenn der Algorithmus von einem Zweig zurückkehren die Datenstruktur nicht für die Verwendung in anderen Branchen aktualisiert wird, nicht verwenden möchten vars, noch Nebenwirkungen, herer mein Code:Fehler bei der Aufrechterhaltung der Integrität der Datenstruktur in einem Graphenalgorithmus in einer funktionalen Art und Weise
type Vertex=Int
type Graph = Map[Vertex,Set[Vertex]]
def DFS(start: Vertex, g: Graph): Int = {
def loop(v: Vertex, visited: List[Vertex], size: Int = 0): Int = {
val neighbours: List[Vertex] = (g(v) filterNot visited.contains).toList
if (neighbours == Nil) size
else {
(for (elem <- neighbours) yield loop(elem, v :: visited, size + 1)).max }
}
loop(start, List())
}
Sieht aus wie Sie zurückkommen müssen 'visited' zusammen mit Ihrem' max' und verwenden 'foldLeft' statt' for' vorbei Zustand in den nächsten 'loop' und es nach dem gefalteten zurück. –
Willst du etwas wie foldLeft, um das modifizierte 'visited' zu passieren? EDIT: Heh, @VictorMoroz, schnappen! –