2014-03-31 2 views
0

내가 예를g와 동일한 패리티 함수를 만듭니다. MIT 방식의 w

(same-parity 1 2 3 4 5 6 7)->(1 3 5 7) 
(same-parity 2 3 4 5 6)->(2 4 6). 

를 들어, 하나 또는 그 이상의 정수를 받아 첫 번째 인수와 같은 짝수 홀수 패리티가 모든 인수의 목록을 반환하는 함수를 작성하는 것을 시도하고 내 이 (same-parity (list 1 2 3 4))을하려고 할 때 코드가

(define (same-parity g . w) 
    (define (iter-parity items) 
     (if (= (length items) 1) 
      (if (= (remainder items 2) (remainder g 2)) 
       item 
       '()) 
      (if (= (remainder g 2) (remainder (car items) 2)) 
       (cons (car items) (iter-parity (cdr items))) 
       (iter-parity (cdr items))))) 
    (cons g (iter-parity w))) 

, 나는 오류 메시지를 받았습니다 : 차에 첫 번째 인수로 전달 된 객체를(), 올바른 형식이 아닙니다.

나는 어떤 일이 일어나는지 말해 줄 수 있습니까?

+0

여기가 첫 번째 질문이므로 코드를 식별 할 수있는 자유를 확보하여 더 읽기 쉽도록했습니다. 장래에 우리가 당신의 코드를 이해할 수 있도록 이것을하십시오 :) – jozefg

+0

'nil'을 기본 경우로하는 것은 길이가 1 인리스트보다 더 자연스러운 재귀 패턴을 만들어냅니다. – molbdnilo

답변

2

귀하의 코드

여기에 귀하의 기본 구조와 유지 리팩토링의 제안 :

  • 이 절차를 odd?even? 오히려 사용하는 것이 더 관용적이다

    (define (same-parity g . w) 
        (define filter-predicate? (if (odd? g) odd? even?)) 
    
        (define (iter-parity items) 
        (if (null? items) 
         '() 
         (if (filter-predicate? (car items)) 
          (cons (car items) (iter-parity (cdr items))) 
          (iter-parity (cdr items))))) 
    
        (cons g (iter-parity w))) 
    

    주 than remainder

  • 은 목록이 비어있을 때 기본 대문자를가집니다. 단 하나의 항목 만있는 경우가 아닙니다 (코드에서 반복적으로 긍정적 인 효과를 피할 수 있음). 이 때문에 다음과 같이 또한

, 내장 된 계획에 filter 절차, 당신은 그것을 표현할 수 :

(define (same-parity g . w) 
    (cons g (filter (if (odd? g) odd? even?) w))) 

귀하의 질문 (same-parity (list 1 2 3 4))에 관한 질문에 대해서는

을 : 당신은 (귀하의 사양에 설명 된대로) 귀하의 절차를 같이 사용하십시오.

(same-parity 1 2 3 4) 

또는 여기 apply를 사용하려면 (same-parity 1 2 3 4) (4 개 파라미터)로 (same-parity (list 1 2 3 4)) (1 파라미터리스트)를 변화시킬

> (apply same-parity (list 1 2 3 4)) 
'(1 3) 

apply 때문이다.

+0

고마워요! 당신의 대답은 매우 도움이됩니다! – sTeriyaki

+0

당신을 환영합니다 ;-) – uselpa