2017-04-09 1 views
0

비록 목록을 호출하고 그것이 짝수 일지 또는 이상한지를 확인하는 것이 이런 방식으로 작동합니다. 목록 [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

코드에서 조건자를 올바르게 적용하지 않습니다. evenEE의 정의에서 :

(define (evenEE L) 
    (if (or (null? L) (null? (cdr L))) 
    L 
    (cons (car L) 
      (cons (isEven) 
        (evenEE (cddr L)) 
        )))) 

당신은 (isEven (cadr L))(isEven)를 교체해야합니다. 그러면 isEven이 목록의 두 번째 요소와 함께 호출됩니다. 귀하가 제공 한 오류 메시지를 기반으로 이전에 (isEven (cdr L))으로 추측했습니다. 그것은 불만의 꼬리 전체가 평평한 지 시험해보기위한 것이고, 이는 의미가 없습니다.

제쳐두고, isEven의 if 형식은 중복됩니다.

(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)))))) 

테스트 그것을 : 당신은 그래서 전체 프로그램은 다음과 같이한다

(define (isEven E) 
    (= (modulo E 2) 0)) 

(define (isEven E) 
    (if(= (modulo E 2) 0) #t #f)) 

을 대체 할 수

> (evenEE '(2 6 4 5)) 
'(2 #t 4 #f) 
+0

당신은, 지휘관는 것 맞다 전체 목록을보십시오. Cadr은 현재의 요소만을 볼 것입니다. – Learning

+0

@Learning 다행히 도울 수 있습니다. 만족 스럽다면 대답을 승인 된 것으로 표시 할 수 있습니다. –

관련 문제