2012-12-14 4 views
1

비음 수식 int gers 목록을 취하고 표시된 각 값을 순서대로 포함하는 목록을 반환하는 Scheme 절차 (repeats-a-lot lst)를 완료하십시오 횟수는 값과 같습니다. 아래 예를 참조하십시오. 솔루션에서 역순으로 사용할 수 있습니다. 귀하의 솔루션에있는 보조 도구 을 사용하여 더 많은 공간을 확보 할 수 있습니다.목록의 값을 값의 수로 반복하십시오.

참고 : 숙제가 아닙니다. 그것은 연습 문제이며 방금 대답을 얻을 수 없습니다.

+1

[무엇을 시도해 봤습니까?] (http://whathaveyoutried.com) –

답변

0

나는이 연습 문제를 스스로 해결할 수 있도록 몇 가지 힌트를 드리겠습니다. 가장 먼저 할 수있는 일은 가능한 한 두 가지 절차로 문제를 분리하는 것입니다.

(define (repeat n i) 
    (if (zero? i)    ; if no more repeats are needed 
     <???>     ; return the empty list 
     (cons <???>    ; else cons `n` and advance the recursion 
      (repeat <???>  ; `n` is left unchanged 
        <???>)))) ; but `i` is diminished by one 

번째 절차 입력 lst 반복하고 모든 결과를 결합 헬퍼로서 이전을 사용하여 다수 n 주어진 첫번째는, ni 반복으로리스트 생성을 담당 repeat에 의해 생성 된 하위 목록 :

(define (repeats-a-lot lst) 
    (if (null? lst)      ; if the list is empty 
     <???>       ; return the empty list 
     (append (repeat <???> <???>)  ; append n repetitions of current element 
       (repeats-a-lot <???>)))) ; and advance the recursion over the list 

이 문제를 해결하기 위해 여러 가지 방법이 있습니다, 일부 애호가 (등, 접이식 절차를 사용하여, 꼬리 재귀를 사용)하지만 이럴 의미에서, 가장 간단한 방법입니다 그것은 단지 요구한다. 절차를 조작하는 몇 가지 기본 목록에 대한 지식. 어쨌든 예상대로 작동합니다.

(repeats-a-lot '(1 2 3)) 
=> '(1 2 2 3 3 3)