编写一个名为insert-list的过程,它接受一个数字L和一个树T的列表,并返回通过将所有数字从L插入T而得到的树。
这是我的代码:
(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
为什么我一直收到此错误?
答案 0 :(得分:3)
我认为您的代码是正确的,问题是测试用例。
使树期望一个值和两个(可能为空)列表。
(insert-list '(3 4 5) '())
给出
(3 () (4 () (5 () ())))
我认为您对测试用例的要求是什么。
错误是由于程序期望树的第二个和第三个位置中的列表,并尝试分解4,导致您看到的错误。当(right t)
上的小于分支调用'(3 4 5)
并将结果4
传递给insert-list时,会导致特定错误:
(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 () ())))))