合同违规方案逻辑

时间:2017-04-09 17:48:00

标签: scheme racket

我虽然调用一个列表并检查它是偶数还是奇数会这样工作。 它假设取一个列表[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))
                   ))))

1 个答案:

答案 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)