Ich habe eine Methode, in der ich eine leere Liste erstellen, einige Werte anhängen und dann diese Liste zurückgeben möchte. Meine Methode gibt eine leere Liste zurück. Was mache ich falsch?Erstellen und Zurückgeben einer Liste in einer Methode in Scheme
(define-struct graph (vertices edges))
(define-struct vertice (name visited))
(define-struct edge (start-vertice end-vertice length))
;I create data for testing here
(define vertices-list2
(list (make-vertice 0 0)
(make-vertice 1 0)
(make-vertice 2 0)
)
)
(define edges-list2
(list (make-edge 0 1 0)
(make-edge 1 2 0)
)
)
(define (find-adj V edge-list)
(let ((ret '()))
(cond
[(empty? edge-list) ret]
[(eq? V (edge-start-vertice (car edge-list)))
(begin
(append ret '((edge-end-vertice (car edge-list))))
(find-adj V (cdr edge-list)))
]
[else (find-adj V (cdr edge-list))]
)
)
)
(define G (make-graph vertices-list2 edges-list2))
(find-adj 0 (graph-edges G))
Alle Wege durch 'find-adj' Ende entweder in einem rekursiven Aufruf zu' find-adj', oder sie geben 'ret' zurück, das gerade zwei Zeilen zuvor an'() 'gebunden wurde. Daher geben alle Aufrufe letztendlich eine leere Liste zurück. – melpomene
Laut https://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._append%29%29 gibt 'append' ein neues zurück Liste; Es ändert nicht "ret". Selbst wenn dies der Fall ist, verwenden Sie weder den Rückgabewert von append noch "ret", nachdem "append" aufgerufen wurde. – melpomene
Ich sehe, das macht Sinn. Aber wie kann ich es dann machen, da ich rekursiv find-adj aufrufen muss? Ich möchte eine Liste aller Nachbarn zurückgeben, also muss ich sie irgendwo speichern, wenn ich sie finde, und diese Liste mit jeder Rekursion anhängen. – Arcane