【问题标题】:Scheme Binary Search Tree Error (R5RS)方案二叉搜索树错误 (R5RS)
【发布时间】:2012-09-06 01:27:41
【问题描述】:

总的来说,我对 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 插入树的末尾失败。直到,它按计划工作。这是我愚蠢的语法/逻辑错误的原因吗?

【问题讨论】:

    标签: scheme binary-search-tree racket r5rs


    【解决方案1】:
    ((list (car t) ((insert (cadr t)  x)) (caddr t)))
    

    外圆括号是这里的问题。 (list (car t) ((insert (cadr t) x)) (caddr t)) 给你一个列表。通过将另一对括号括在它周围,您正在尝试将该列表应用为一个函数,而您不能 - 因此出现错误消息。

    【讨论】:

    • 非常感谢!我有一种感觉,这对我来说是一个愚蠢的错误。像魅力一样工作。我想整个“如有疑问,请添加更多括号”在这里并不适用。
    • @Ryan 你知道 Python 是如何对缩进敏感的,而 Ruby 是对空格敏感的吗? Lisp 和 Scheme 对括号敏感。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 2010-12-23
    • 2019-04-15
    • 2016-12-04
    相关资源
    最近更新 更多