学习 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) . -)
我尝试使用 list 而不是 cons,它以 list-of-lists 的形式提供了部分正确的答案:
(((2 3) + (7 8) -) *)
然而,正确的答案是:
(2 3 + 7 8 - *)
任何回答的人都可以提供提示或指针,而不是修改代码,以便我更好地理解问题吗?我宁愿不看教程的答案,因为那不会帮助我了解我做错了什么。
放心,等基本的递归函数搞清楚后,我会把它变成一个尾递归函数。
感谢任何可以提供帮助的人!