2017-04-17 4 views
-1

Scheme에서는,리스트를 인수로서 취해, 인수리스트로부터 짝수 정수만을 포함한리스트를 돌려줍니다. 나는 함수의 인수로 전달하는 작은 목록을 구축 내 기능 even-list를 테스트하려면짝수 형의리스트를 작성하기위한 Scheme 함수

(define (even-list n) 
    (if (even? car(n)) 
     (cons car(n) even-list(cdr(n))) 
     (even-list cdr(n)) 
    ) 
) 

: 문제를 통해 작업 후, 이것은 내가 함께 온 것입니다. 나는 아래의 코드를 실행할 때, 발생하는 모든 목록이 출력되는 것입니다 : 내가 "even""even"으로 then 절을 교체로도, 함수를 호출하지 않는 것 거의 같다

even-list (list 1 2 3 4 5 6 7 8 9 10) 

했다 출력되지 않습니다. 어떤 아이디어?

+0

이 ... 질문을 게시하기 전에 구문 오류를 수정. – naomik

답변

2

scheme/racket은 prefix 표기법을 사용하므로 적용되는 모든 프로 시저가 열기 및 닫기 대괄호 ((function-name arg1 arg2 ...))로 묶입니다.

이 의미 car(n), cdr(n), even-list(...) 등 잘못된 구문이며, 각각 (car n), (cdr n), (even-list ...) 등으로 대체되어야한다. 프로 시저 even-list에 수정을 할 때 당신이 있기 때문에 단순히

even-list (list 1 2 3 4 5 6 7 8 9 10) 

를 작성하면/바인딩하지 않을 수도 식별자 (even-list)를 호출하는으로, 출력에 어떤 변화가 표시되지 않는 이유

은 또한 (이 경우에는 함수 정의로 바인드됩니다), 표현식은 (list 1 2 3 4 5 6 7 8 9 10)입니다. 이 표현식이 목록 출력을 반환하는 것이므로 even-list 내에서 변경 한 내용은 실제로 프로 시저에 인수로 전달하지 않았기 때문에 list 내장 함수를 사용하여이 목록에 반영되지 않습니다 순서.

당신이 줄을 수정하면 :

(even-list (list 1 2 3 4 5 6 7 8 9 10)) 

당신은 당신의 프로 시저 로직에서 줄기 오류를 발견하기 시작합니다. 예를 들어, recursive 함수에는 기본 사례가 없습니다. 즉, 함수가 목록을 통해 반복 될 때 '() 요소 목록에 도달하면 (car n)을 적용하려고 시도합니다. 이는 car에 대한 계약 위반입니다. 인수에 대해서는 pair?입니다. 사용

(define (even-list lst) 
    (cond 
    ((null? lst) empty)       ; base case (empty? list) 
    ((even? (car lst))       ; even? first element 
    (cons (car lst) (even-list (cdr lst)))) 
    (else (even-list (cdr lst))))) 

또는 내장 filter 절차 :

는 다음과 같은 고려

유효 체계/라켓이 아니다
(define (even-list lst) 
    (filter even? lst))