2014-09-15 3 views
1

발견 된 모든 요소를 ​​목록에 복제하려고합니다. 나는 아이디어를 가지고 있지만 제대로 만들 수는 없다. 샘플 입력> (패스 '(1 2 3 4 4))는 출력 (1 1 2 2 3 3 4 4 4 4)을 갖습니다. 누구든지 저를 도와줍니다. 여기에 내 코드가있다.스키마의 목록에서 발견 된 모든 요소 복제

(define duplicate 
    (lambda (mylist n) 
    (cond ((null? mylist) "Not found") 
     ((< n 2) (cons (car mylist) 
     (duplicate mylist (+ n 1)))) 
      (else 
      (duplicate (cdr mylist) 0))))) 
    (define pass 
    (lambda (mylist) 
     (duplicate list 0))) 

나는 모든 귀중한 의견을 부탁 할 것이다. , 더 나은

(define (pass lst) 
    (if (null? lst) 
     '() 
     (cons (car lst) 
      (cons (car lst) 
        (pass (cdr lst)))))) 

또는 :

답변

2

그냥 수정의 부부 (주석 참조) 우리가 갈 수 있어요 : 절차가 조금 단순화 할 수

(define duplicate 
    (lambda (mylist n) 
    (cond ((null? mylist) '()) ; base case must return the empty list 
      ((< n 2) (cons (car mylist) 
         (duplicate mylist (+ n 1)))) 
      (else 
      (duplicate (cdr mylist) 0))))) 

(define pass 
    (lambda (mylist) 
    (duplicate mylist 0)))  ; pass myList, not list 

공지 것을 더 관용적 솔루션을 고차원 절차를 사용하여 :

(define (pass lst) 
    (foldr (lambda (ele acc) (list* ele ele acc)) 
     '() 
     lst)) 

또 다른 대안 :

(define (pass lst) 
    (append-map (lambda (ele) (list ele ele)) 
       lst)) 

어쨌든, 예상대로 작동합니다

(pass '(1 2 3 4 4)) 
=> (1 1 2 2 3 3 4 4 4 4) 
+1

덕분에 많이. : D 진정으로 도움이됩니다. 고마워요 ;) –

0

그 자체로 duplicatezip 등의 목록을 치료하는 것이 더 간단 할 수있다. 그런 다음 flatten 결과 목록을 만듭니다.

방식 또는 라켓

는 :

(require srfi/1) 

(define (duplicate-list-members lox) 
    (flatten (zip lox lox))) 

가 O에서 실행하더라도 (n)의 시간은, 프로파일 링은 두리스트를 통과하는 병목임을 표시하고 기능을 개서 정당화 할 수있다. 그렇지 않을 수도 있습니다.

1

나는 그렇게 할 것 :

(define (dup l) 
    (define (iter l co) 
    (if (null? l) 
     (co '()) 
     (iter (cdr l) 
       (lambda (x) 
       (co (cons (car l) (cons (car l) x))))))) 
    (iter l (lambda (x) x))) 

(dup '(1 2 3)) 
관련 문제