方案二进制搜索树错误(R5RS)

时间:2012-09-13 01:10:57

标签: scheme binary-search-tree racket r5rs

我对Scheme和函数语言一般都是新手。我正在尝试创建一个二叉搜索树。节点的格式是三个元素的列表,第一个是节点处的值,第二个是左子节点,第三个是右子节点。我有一个“make”函数,它创建一个空树:(()()())。我也有插入功能。这是代码:

;Inserts a number into the tree
(define (insert t x)
  (cond ((null? (car t))
      (list x (make) (make)))
      ((< x (car t))
       ((list (car t) ((insert (cadr t)  x)) (caddr t))))
      ((> x (car t))
       ((list (car t) (cadr t) ((insert (caddr t) x)) )))

  )
)

;Makes a new empty tree
(define (make)
  (list (list) (list) (list))
)

为了测试它,我运行以下行:

> (define b1 (make))
> (define b2 (insert b1 1))
> b2
(1 (() () ()) (() () ()))
> (define b3 (insert b2 2))

然后我收到以下错误:

application: not a procedure;
expected a procedure that can be applied to arguments
given: (2 (() () ()) (() () ()))
arguments...: [none]

我检查并重新检查了我的括号...并在调试模式下运行它,我看到它在插入2的结束时失败了。直到它,它按计划工作。这是我的愚蠢语法/逻辑错误的原因吗?

1 个答案:

答案 0 :(得分:4)

((list (car t) ((insert (cadr t)  x)) (caddr t)))

外面的括号是这里的问题。 (list (car t) ((insert (cadr t) x)) (caddr t))为您提供了一个列表。通过在它周围包裹另一对括号,你试图将该列表应用为它是一个函数,你不能 - 因此错误信息。