2016-06-11 24 views
0

ich in einer meiner Funktionen eine neue Warteschlange zu erstellen bin versucht, aber ich bin Fehler immerin einer Funktion definieren Warteschlange

definieren: eine Definition gefunden, die nicht auf der obersten Ebene ist

Wie kann ich das beheben? Ich muss diese Warteschlange irgendwo innerhalb erstellen. Ich kann nicht einfach Hilfsvariablen außerhalb davon erstellen.

(define (bfs-graph X G) 
    (define q (make-queue)) 
    (enqueue! q X) 
    ... some work with queue 
) 

(define (reachable? X Y G) 
    (cond 
    [(empty? (graph-edges G)) #f] 
    [else (bfs-graph X G)] 
    ) 
) 

EDIT:

Ok, das scheint, wie es funktioniert. Ich werde versuchen, mit dem Code etwas mehr zu spielen. Vielen Dank.

(define (reachable? X Y G) 
    (let ((q (make-queue))) 
    (cond 
     [(empty? (graph-edges G)) #f] 
     [else (bfs-graph X G q)] 
    ) 
    ) 
) 


(define (bfs-graph X G q) 
    (enqueue! q X) 
) 
+0

Haben Sie eine neue, andere Warteschlange jedes Mal 'bfs-graph' genannt erstellen möchten ist, oder die gleiche Warteschlange wiederzuverwenden zwischen verschiedene Aufrufe von 'bfs -Graph? –

+0

Nun, da ich daran denke, werde ich bfs-graph rekursiv wiederverwenden. Ich versuche es, da Sie vielleicht alle Nachbarn eines gegebenen Eckpunktes gefunden haben und ich setze sie in eine Warteschlange, also hätte ich gerne dieselbe Warteschlange, die ich mit neuen Werten anhängen könnte. – Arcane

+1

Dann ist es eine bessere Idee, die Queue außerhalb der Prozedur zu erstellen und sie als Parameter von der Prozedur, die die Berechnung startet, weiterzugeben. –

Antwort

3

Der Code, den Sie arbeiten gepostet sollte, versuchen Sie, die Sprache zu ändern - die Einstellung „von der Quelle Sprache bestimmen“, und fügen Sie diese Zeile am Anfang der Datei:

#lang racket 

Wenn aus irgendeinem Grund Sie nicht eine andere Sprache verwenden können, ist dies äquivalent zu dem, was Sie geschrieben haben:

(define (bfs-graph X G) 
    (let ((q (make-queue))) 
    (enqueue! q X) 
    ; ... some work with queue 
    )) 
+0

Ich hätte wahrscheinlich sagen sollen, dass ich "Advanced Student" in DrRacket verwende. Deine Lösung funktioniert jetzt aber ich habe eine Frage. Ich habe herausgefunden, dass ich auch local() nur nutzen kann. Was sind die Unterschiede? Auch wenn ich mehr "(enqueue! Q 5)" hintereinander gebe, ruft es diesen Fehler auf: 'let: erwartet nur einen Ausdruck nach den Bindings, aber gefunden 1 extra part ' – Arcane

+1

Sie sind mehr oder weniger die gleichen, siehe dies [Antwort] (http://stackoverflow.com/a/15236960/201359) für ein bisschen mehr Informationen über 'local'. Ich würde lieber "Let" verwenden, es ist Standard-Schema. Der Fehler, den Sie erhalten, wird sicherlich durch falsch platzierte Klammern verursacht. Sehen Sie sich bitte [Dokumentation] (https://docs.racket-lang.org/reference/let.html) an, um sicherzustellen, dass Sie die Syntax verwenden korrekt. –

+0

Sie können '(local [(definieren q (make-queue))] (beginnen (Enqueue! Q X) .... einige arbeiten mit q ....))'. –

Verwandte Themen