2

数 L と木 T のリストを取り、L のすべての数を T に挿入した結果の木を返す、insert-list という手続きを書きます。

これは私のコードです:

(define (make-tree value left right) (list value left right))
(define (value tree) (car tree))
(define (left tree) (cadr tree))
(define (right tree) (caddr tree))

(define (insert-list L T)
  (cond ((null? L) T)
        ((null? T) (insert-list (cdr L) (make-tree (car L) '() '())))
        ((= (car L) (value T)) (insert-list (cdr L) T))
        ((< (car L) (value T)) (insert-list (cdr L) (make-tree (value T)(insert-list L (left T)) (right T))))
        ((> (car L) (value T)) (insert-list (cdr L) (make-tree (value T) (left T)  (insert-list L (right T)))))))

エラーが発生し続けます:

car: contract violation
  expected: pair?
  given: 4

このエラーが発生し続けるのはなぜですか?

4

1 に答える 1

3

あなたのコードは正しいと思います。問題はテスト ケースです。

Make tree は、値と 2 つの (場合によっては空の) リストを期待します。

(insert-list '(3 4 5) '())

与える

(3 () (4 () (5 () ())))

これは、テストケースに必要なものだと思います。

このエラーは、プログラムがツリーの 2 番目と 3 番目の位置にあるリストを予期していて、4 を分解しようとするために発生し、表示されているエラーにつながります。より小さい分岐が を呼び出し、結果を挿入リストに渡すと、特定のエラーが発生(right t)'(3 4 5)ます4

(insert-list (list 1 2 3 4) 4)

equals 句は、 を呼び出したときにエラーをスローするものであり、(value 4)表示されているエラーが表示されます。

> (car 4)
. . car: contract violation
  expected: pair?
  given: 4

理解を深めるのに役立つ場合は、コードが正しいという結論に達するために調べたテスト ケースを次に示します。

(require test-engine/racket-tests)
; Check tree generation
(check-expect (make-tree '() '() '()) '('() '() '()))
(check-expect (make-tree 3 '() '()) (list 3 '() '()))

; Null list case
(check-expect (insert-list '() '(1 '() '())) '(1 '() '()))
; Null tree case
(check-expect (insert-list (list 1) '()) '(1 '() '()))
; left case
(check-expect (insert-list '(2) (make-tree 3 '() '())) '(3 '(2) '())) 
; right case
(check-expect (insert-list '(4) (make-tree 3 '() '())) '(3 '() '(4)))
; nested left case
(check-expect (insert-list '(2 1) '(3 '() '())) '(3 '(2 '(1) ()) ()))
; nested right case
(check-expect (insert-list '(4 5) '(3 '() '())) '(4 '() '(5 '() '())))

(check-expect (insert-list (list 3 1 2 3 4 5) (make-tree 1 '() '())) 
    (1 () (3 (1 () (2 () (3 () (4 () (5 () ()))))) (4 () (5 () ())))))
于 2013-10-19T22:28:36.010 に答える