0

Я полный новичок с Lisp, поэтому легко на меня. Я пытаюсь реализовать двоичное дерево поиска в массиве и иметь возможность выводить его по порядку. У меня есть этот массив, где индекс 1 является корнем и 2 * я это левый ребенок, 2 * я + 1 является правильным ребенком:Код в функции, не выполняемой

#(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) 

И Im посылая его в эту функцию, чтобы извлечь в порядке вывода из дерева:

(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))) 

Ожидаемый результат должен быть 3,10,15,17,20,30,50,70,80, но я получаю 3,10,15,30. Похоже, что код после формата не выполняется. Если кто-то может мне помочь, это было бы очень признательно.

+0

Пожалуйста, не указывайте имена на камбеле в CL. По умолчанию читатель выведет незаписанные символы. Вот почему ваш, если вы eval '' leftU' в repl, вы увидите 'LEFTU'. [Символы TLDR не чувствительны к регистру] – Baggers

ответ

1

Вы используете leftI и rightI как абсолютные переменные, поэтому рекурсия не работает должным образом. Вместо этого определите их как локальные переменные с помощью 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

Спасибо. Работал :) – AllAnimals