我必须制作这个程序:
我已经能够制作一个程序,正确地判断出树中是否存在某些东西,但如果树中存在某些东西,它就会中断。
调试消息根本没用。我使用car
的唯一地方是3个辅助功能。有人可以解释这意味着什么/我应该做什么?我一直在修补,无法找到解决办法。
以下是我目前的情况:
(define (val T)
(car T)
)
(define (left T)
(car (cdr T))
)
(define (right T)
(car (cdr (cdr T)))
)
(define (tree-member-helper? V T)
(if (not (null? (val T)))
(if (< V (val T))
(tree-member-helper? V (left T))
(if (> V (val T))
(tree-member-helper? V (right T))
#t
)
)
'()
)
)
答案 0 :(得分:2)
在这部分:
(not (null? (val T)))
您正在检查值是否为空。树的典型迭代检查值是否为空树。在您的情况下()
,因为节点(1 () ())
是一个值为1的节点,并且没有空树作为子节点。
首先,当您确定节点不为空时,您可以对它们执行car
和cdr
(或调用执行此操作的函数)。
现在为什么我们期望caddr
无需检查你可能会问。好吧,如果你发送一个像'(1 (2) (3))
这样的无效树,它就没有了,你会收到类似的错误。您可以通过创建一个检查节点确实有效的函数来解决此问题:
(define (valid-node? node)
(and (list? node)
(= (length node) 3)
(number? (car node))))
答案 1 :(得分:0)
该函数不会中断,因为该值不在树中,它会中断,因为car
不会在空列表上运行(它需要一对)。第一个示例成功,因为它在必须在空列表上使用car
之前找到1。
为了解决这个问题,我会检查以确保在调用它们之前,对right
或left
的每次调用实际上都是在一对上进行操作。
不幸的是,我不知道Scheme,或者一般的Lisp,足以提供一个例子,但希望能让你开始朝着正确的方向前进。