0

私は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))
 )

それらはうまく機能します。これが私のas-listです:

;Gives list of all numbers
(define (as-list t)
    (cond
         (
           (null? (car t) )
           (list)
         )
          (
           #t
           (append (as-list (cadr t)) (as-list (car t)) (as-list (caddr t)))
         )
     )
  )

これを実行すると、「mpair?」を予期していると言って、契約違反が発生します。これが私の側の論理エラーであるとは思わないが、そうかもしれない。これは別の括弧の問題ですか?
お時間をいただきありがとうございます!

4

1 に答える 1

1

あなたの再帰は

(append (as-list (caddr t)) (list (car t)) (as-list (caddr t)))

ツリーで as-list を呼び出したいだけで、 t の車はツリーではありません。

于 2012-09-14T21:09:04.590 に答える