汽车例外:()不是一对

时间:2017-09-15 03:15:57

标签: lambda scheme lisp

我必须制作这个程序:

enter image description here

我已经能够制作一个程序,正确地判断出树中是否存在某些东西,但如果树中存在某些东西,它就会中断。 enter image description here

enter image description here  调试消息根本没用。我使用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
            )
        )
        '()
    )
)

2 个答案:

答案 0 :(得分:2)

在这部分:

(not (null? (val T)))

您正在检查是否为空。树的典型迭代检查值是否为空树。在您的情况下(),因为节点(1 () ())是一个值为1的节点,并且没有空树作为子节点。

首先,当您确定节点不为空时,您可以对它们执行carcdr(或调用执行此操作的函数)。

现在为什么我们期望caddr无需检查你可能会问。好吧,如果你发送一个像'(1 (2) (3))这样的无效树,它就没有了,你会收到类似的错误。您可以通过创建一个检查节点确实有效的函数来解决此问题:

(define (valid-node? node)
  (and (list? node)
       (= (length node) 3)
       (number? (car node))))

答案 1 :(得分:0)

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

为了解决这个问题,我会检查以确保在调用它们之前,对rightleft的每次调用实际上都是在一对上进行操作。 不幸的是,我不知道Scheme,或者一般的Lisp,足以提供一个例子,但希望能让你开始朝着正确的方向前进。