Lambda 车内异常:()不是一对

Lambda 车内异常:()不是一对,lambda,scheme,lisp,Lambda,Scheme,Lisp,我有一个我必须做的计划: 我已经能够制作一个程序,正确地计算出树中是否存在某些东西,但如果树中没有某些东西,它就会崩溃。 调试消息一点帮助都没有。我唯一使用过car的地方就是3个辅助功能。有人能解释一下这意味着什么/我应该做什么吗?我一直在修修补补,找不到解决办法 以下是我目前掌握的情况: (define (val T) (car T) ) (define (left T) (car (cdr T)) ) (define (right T) (car (cdr

我有一个我必须做的计划:

我已经能够制作一个程序,正确地计算出树中是否存在某些东西,但如果树中没有某些东西,它就会崩溃。

调试消息一点帮助都没有。我唯一使用过
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
            )
        )
        '()
    )
)
(定义(val T)
(T车)
)
(定义(左T)
(汽车(cdr T))
)
(定义(右T)
(车辆(cdr(cdr T)))
)
(定义(树成员辅助对象?V T)
(如果(不是(null?(val T)))
(如果(V(val T))
(树成员助手?V(右T))
#t
)
)
'()
)
)

函数不会因为值不在树中而中断,而是因为
car
不会在空列表上运行(它需要一对)而中断。第一个示例成功,因为它在使用空列表中的
car
之前找到了1

为了避免这种情况,我会检查以确保对
right
left
的每次调用在调用它们之前实际上都在一对上运行。 不幸的是,我不太了解Scheme,也不太了解Lisp,不足以提供一个示例,但希望这能让您从正确的方向开始。

在本部分中:

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

在使用car的地方包含辅助函数的定义可能会有帮助。lol@AzureHeights多傻啊。我想是的,但我猜不是。它们现在就在那里:)当树为空时,应该终止递归。思考一下
(val T)
是什么。T不应该为空,我检查它。。。。哦
(如果(not(null?(val T)))
我想就是这样了……另一方面,Scheme中唯一的“false-y”值是
#f
)(
在Lisp中是false-y,但在Scheme中不是。)