2013-02-08 2 views
1

기호 목록을 소비하고 'cat의 모든 인스턴스가 두 배가되는 동일한 목록을 반환하는 함수 one을 어떻게 개발 하시겠습니까?목록/복합 데이터

그래서

(one (cons 'animal(cons 'table (cons 'cat (cons 'bread 
    empty))))) 
예를

위해 나는 답례로 (나는 가정)

(cons 'animal (cons 'table (cons 'cat (cons 'cat (cons 'bread 
    empty))))) 

을 얻을 것입니다. 나는 책을 읽고 그것에 대해 좌절시키고있다.

+0

사용할 논리 절차는 SRFI1/R6RS에서 'fold-left'또는 'fold-right'입니다. – leppie

+0

BTW :'(cons 'animal (cons'cat (cons '빵 빈))))''(animal table cat bread)'로 쓰여집니다. – leppie

+0

@leppie 꼭 원한다면 똑같은 것은 아닙니다. 'set-car!'또는'set-cdr! '를 사용하십시오. :-피 –

답변

3

이것은 다른 목록을 작성하는 동안 반복적으로 목록을 탐색하는 방법 중 가장 간단한 예 중 하나입니다. 학습 과정에 있기 때문에 직접 작성해야합니다.

(define (copy lst) 
    (if <???>     ; is the list empty? 
     <???>     ; if so, return the empty list 
     (cons <???>   ; otherwise `cons` the first element of the list (*) 
      (copy <???>)))) ; and advance the recursion over the rest of the list 

(*) ...하지만 요소가 그것의 'cat 다음 단점 사본 인 경우 : 나는 빈칸을 채워, 당신에게 솔루션의 일반적인 구조와 조금 도움이됩니다.

(copy (cons 'one (cons 'animal (cons 'table (cons 'cat (cons 'bread empty)))))) 

...이 동등 될 일이 : 질문의 목록

테스트를

(copy '(one animal table cat bread)) 

어느 쪽이든은, 결과는 입력 목록의 복사본입니다 동일한 요소들 (그리고 각각 'cat의 사본 2 개가 발견되었지만)이 새 영사기 내부에 존재합니다.

2

Leppie (내 set-car!/set-cdr! 위의 의견에 대한 응답으로 "트래픽에서 당신의 돌연변이와 놀아달라고"했습니다.))는 폴드 기반 솔루션을 작성하길 원했기 때문에 여기에 있습니다!

(define (fun lst) 
    (fold-right (lambda (e r) 
       (case e 
       ((cat) (cons* e e r)) 
       (else (cons e r)))) 
       '() lst))