2012-11-10 3 views
3

Scheme에서이 프로그램을 구현하는 데 어려움을 겪고 있습니다. 불행히도 숙제가 있기 때문에 약간 애매해야합니다. (A B C D) 돌아가고 싶습니다 (B D). 하지만 safe-car에 인수로 전달 된 object()가 한 쌍이 아니라는 오류가 표시됩니다. | " 이 내 코드입니다 :다른 모든 요소의 목록을 반환하는 scheme 프로 시저

(DEFINE (other_el lis) 
    (COND 
    ((NULL? lis) '()) 
    ((LIST? lis) 
    (append (CADR lis) (other_el (CDR lis)))) 
    (ELSE (show " USAGE: (other_el [LIST])")))) 
+1

당신이 기능'cddr'을 잘 알고있는? –

답변

1

내가 적절한 코드를 설명하기 전에 언급해야이 코드에 사소한 문제가 있습니다

    같은 지휘관 등 절차의 이름을 투자하지 마십시오
  1. . 및 계획에 정의
  2. 수동으로 오류 메시지를 표시하지 않습니다 예외를 사용
  3. 당신은 항상 당신의 코드를 들여 쓰기합니다.... (편집 : 누군가가 들여 쓰기를 포함하는 질문의 코드를 편집 한 모양)

어쨌든, 여기 당신이 찾고있는 기능은 다음과 같습니다

(define (evens lst) 
    (if (or (null? lst)    ; if the list is empty 
      (null? (cdr lst)))  ; or the list has a single element 
     '()       ; then return the empty list 
     (cons (cadr lst)   ; otherwise `cons` the second element 
      (evens (cddr lst))))) ; and recursively advance two elements 

나는 DrRacket 5.3의 기능을 테스트하고 사용자가 지정한대로, (B의 D) '리턴 ((A B C 형 D) 고르게)'. 문제가 있으면 알려주세요. 숙제로 행운을 빌어 요!

+0

사용자가 매개 변수를 입력 할 때 인터프리터에게 "목록"이 아닌 특정 오류 메시지를 인쇄 할 수있게하려고합니다. 나는 당신의 논리를 따르려고 노력했지만 그것을 잃었어요 :) 사전에 고마워요 –

+0

자신의 오류 메시지를 포함하는 가장 좋은 방법은 목록에 대한 다른 기능 검사를하고 오류를 처리하는 것입니다 다음 호출 내가 당신에게 준 기능 (오스카가 그의 대답에서 사용한 기법). –

+1

그것은 끔찍한 대답입니다. 솔루션은 쉽게 'O (n)'([this implementation] (http://stackoverflow.com/a/13377695/201359) 참조) 일 수 있지만 조건에서 '길이' 그것을'O (n^2)'로 만들었습니다. 각 반복마다 목록 길이를 확인하지 않아야합니다. –

2

이 질문은 귀하가 요청한 이전 질문보다 상당히 간단합니다. 각 단계에서 길이를 계산할 필요가 없으므로 (매우 비효율적 일 수 있음) 또는 추가 연산을 사용하여 해결해야합니다 (대신 cons 사용). 그것은 숙제처럼 보이기 때문에 여기에 대한 대답의 구조가의 I'l 당신이 채우기에 공백 보자

(define (every-other lst) 
    (if (or <???>     ; if the list is empty 
      <???>)     ; or the list has a single element 
     <???>      ; then return the empty list 
     (cons <???>     ; otherwise `cons` the second element 
      (every-other <???>)))) ; and recursively advance two elements 

당신이 먼저 어떤 에러 체크를 할 다른 기능을 사용하고 후 위의 프로 시저를 호출해야하는 경우 인수가 올바른지 특정 다시 ':

(define (other_el lst) 
    (if (list? lst) 
     (every-other lst) 
     (error "USAGE: (other_el [LIST])"))) 

이처럼 사용

(other_el '(A B C D E G)) 
=> '(B D G) 
+0

빈 목록을 확인하기 위해 목록에 단일 요소가 있는지 (null? lst) 확인하는 구문이 있습니까? 죄송합니다.이 언어가 너무 기본적인 것이면, 나는 아직이 언어에 익숙하지 않습니다. Google은 도울 수 없었습니다 :) –

+0

@NathalieD 물론입니다. 현재 요소 뒤의 다음 요소가 널 목록인지 확인하십시오 :'(null? (cdr lst))' –

관련 문제