我虽然调用一个列表并检查它是偶数还是奇数会这样工作。 它假设取一个列表[2 6 4 5]并检查处于偶数位置的每个元素并打印t或f。 [2 #t 4 #f]。我知道我尝试在列表上做模数,这可能导致错误。有没有办法检查当前列表并检查它是偶数还是奇数。
modulo: contract violation
expected: integer?
given: '(2 3 4)
argument position: 1st
other arguments...:
(define (isEven E)
(if(= (modulo E 2) 0) #t #f))
(define (evenEE L)
(if (or (null? L) (null? (cdr L)))
L
(cons (car L)
(cons (isEven )
(evenEE (cddr L))
))))
答案 0 :(得分:0)
您的代码未正确应用谓词。在evenEE的定义中:
(define (evenEE L)
(if (or (null? L) (null? (cdr L)))
L
(cons (car L)
(cons (isEven )
(evenEE (cddr L))
))))
您需要将(isEven )
替换为(isEven (cadr L))
。这将使用列表中的第二个元素调用isEven
。根据您提供的错误消息,我猜您以前将其作为(isEven (cdr L))
。那将试图测试是否整个尾部是否均匀,这是没有意义的。
另外,isEven
中的if表单是多余的。你可以替换
(define (isEven E)
(if(= (modulo E 2) 0) #t #f))
与
(define (isEven E)
(= (modulo E 2) 0))
所以整个程序应该是这样的:
(define (isEven E)
(= (modulo E 2) 0))
(define (evenEE L)
(if (or (null? L) (null? (cdr L)))
L
(cons (car L)
(cons (isEven (cadr L))
(evenEE (cddr L))))))
测试出来:
> (evenEE '(2 6 4 5))
'(2 #t 4 #f)