Изучение lisp для удовольствия, до сих пор не было слишком сложно, и я на третьей лекции этот сайт. Я пытаюсь выполнить упражнение "Реализовать функцию, которая создаст список, содержащий элементы заданного двоичного дерева в обратном порядке". ." Вот мой код:
(defun bin-tree-postorder (b)
"Create a list containing keys of b in postorder"
(if (bin-tree-leaf-p b)
(list (bin-tree-leaf-element b))
(let
((elmt (bin-tree-node-element b))
(left (bin-tree-node-left b))
(right (bin-tree-node-right b)))
(cons
(append (bin-tree-postorder left)
(bin-tree-postorder right)) elmt))))
Однако он не запускается, потому что я получаю сообщение об ошибке:
*** - APPEND: A proper list must not end with +
Вот мой след:
1. Trace: (BIN-TREE-POSTORDER '(* (+ (2) (3)) (- (7) (8))))
2. Trace: (BIN-TREE-POSTORDER '(+ (2) (3)))
3. Trace: (BIN-TREE-POSTORDER '(2))
3. Trace: BIN-TREE-POSTORDER ==> (2)
3. Trace: (BIN-TREE-POSTORDER '(3))
3. Trace: BIN-TREE-POSTORDER ==> (3)
2. Trace: BIN-TREE-POSTORDER ==> ((2 3) . +)
2. Trace: (BIN-TREE-POSTORDER '(- (7) (8)))
3. Trace: (BIN-TREE-POSTORDER '(7))
3. Trace: BIN-TREE-POSTORDER ==> (7)
3. Trace: (BIN-TREE-POSTORDER '(8))
3. Trace: BIN-TREE-POSTORDER ==> (8)
2. Trace: BIN-TREE-POSTORDER ==> ((7 8) . -)
Я пробовал использовать список вместо минусов, что дает частично правильный ответ в виде списка списков:
(((2 3) + (7 8) -) *)
Однако правильный ответ:
(2 3 + 7 8 - *)
Может ли кто-нибудь, кто ответит, дать подсказки или указатели вместо измененного кода, чтобы я мог лучше понять проблему? Я бы предпочел не смотреть на ответы учебника, потому что это не поможет мне понять, что я делаю неправильно.
Будьте уверены, я превращу его в хвостовую рекурсивную функцию после того, как будет выяснена основная рекурсивная функция.
Спасибо всем, кто может помочь!