0

Ich bin ein kompletter Neuling mit Lisp so gehen Sie einfach auf mich. Ich versuche, einen binären Suchbaum in ein Array zu implementieren und es in der Reihenfolge ausgeben zu können. Ich habe dieses Array, in dem Index 1 ist die Wurzel und 2 * i das linke Kind ist, 2 * i + 1 ist das richtige Kind:Code in einer Funktion wird nicht ausgeführt

#(NIL 30 15 50 10 20 NIL 70 3 NIL 17 NIL NIL NIL NIL 80 NIL NIL NIL NIL NIL NIL 
    NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL 
    NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL 
    NIL NIL NIL) 

Und Im es zu dieser Funktion sendet die um Ausgabe zu extrahieren vom Baum:

(defun inOrder (tree rootIndex) 
    (setq leftI (* rootIndex 2)) 
    (setq rightI (+ leftI 1)) 
    (if (aref tree leftI) 
     (inOrder tree leftI)) 
    (format t "~D," (aref tree rootIndex)) 
    (if (aref tree rightI) 
     (inOrder tree rightI))) 

Das sollte erwartete Ausgabe 3,10,15,17,20,30,50,70,80, aber ich 3,10,15,30 bekommen sein. Es scheint, dass der Code nach dem Format nicht ausgeführt wird. Wenn mir jemand helfen kann, wäre das sehr zu schätzen.

+0

Bitte Camelcase Namen nicht in CL. In der Standardeinstellung wird der Leser nicht aufgezeichnete Zeichen aktualisieren. Dies ist der Grund, warum Sie, wenn Sie '' leftU' 'in der Tabelle sehen, 'LEFTU' sehen. [TLDR Symbole sind nicht case sensitive] – Baggers

Antwort

1

Sie verwenden leftI und rightI als absolute Variablen, so dass die Rekursion nicht wie vorgesehen funktioniert. Stattdessen definieren Sie sie als lokale Variablen mit einem let*:

(defun inOrder (tree rootIndex) 
    (let* ((leftI (* rootIndex 2)) 
      (rightI (+ leftI 1))) 
    (if (aref tree leftI) 
     (inOrder tree leftI)) 
    (format t "~D," (aref tree rootIndex)) 
    (if (aref tree rightI) 
     (inOrder tree rightI)))) 
+0

Vielen Dank. Hat funktioniert :) – AllAnimals

Verwandte Themen