2

私は、Scheme と関数型言語全般についてまったくの初心者です。二分探索木を作成しようとしています。ノードの形式は 3 つの要素のリストです。1 つ目はノードの値、2 つ目は左側の子ノード、3 つ目は右側の子ノードです。空のツリー ( () () () ) を作成する「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を挿入する最後に失敗することがわかります。までは、計画通りに機能します。これは私の愚かな構文/論理エラーの原因ですか?

4

1 に答える 1

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

ここでは、外側の括弧のペアが問題になります。(list (car t) ((insert (cadr t) x)) (caddr t))あなたにリストを与えます。別の括弧のペアをその周りにラップすることにより、そのリストを関数であるかのように適用しようとしていますが、これは不可能です。つまり、エラーメッセージです。

于 2012-09-13T01:18:50.987 に答える