Recursion 在racket中打印列表的元素

Recursion 在racket中打印列表的元素,recursion,scheme,racket,Recursion,Scheme,Racket,我的问题是如何将列表中的元素打印两次,下面给出了我尝试过的代码 (define duplicate-list (lambda (mylist n) (cond ((null? mylist) '()) ((< n 2) (cons (car mylist) (duplicate-list mylist (+ n 1)))) (else (duplicate-list (cdr mylist) 0)))))

我的问题是如何将列表中的元素打印两次,下面给出了我尝试过的代码

(define duplicate-list
(lambda (mylist n)
(cond ((null? mylist) '()) 
      ((< n 2) (cons (car mylist)
                     (duplicate-list mylist (+ n 1))))
      (else 
       (duplicate-list (cdr mylist) 0)))))

(define duplicate 
(lambda (mylist)
(duplicate-list mylist 0)))
然而,所需的预期结果应该是

(duplicate '( (a 1) b ((c)) 2 z 3) = ( (a a 1 1) b b ((c c)) 2 2 z z 3 3) 

您使用了错误的方法来构建输出列表,您必须重复使用
car
cdr
零件,因为这是一个列表列表。试试这个:

(define (duplicate lst)
  (cond ((null? lst)
         '())
        ((not (pair? (car lst)))
         (cons (car lst)
               (cons (car lst) ; here we duplicate each element
                     (duplicate (cdr lst)))))
        (else
         (cons (duplicate (car lst))
               (duplicate (cdr lst))))))
它按预期工作:

(duplicate '((a 1) b ((c)) 2 z 3))
=> '((a a 1 1) b b ((c c)) 2 2 z z 3 3)

下面是另一个使用模式匹配的解决方案-

它按预期工作-

(duplicate '((a 1) b ((c)) 2 z 3))
; '((a a 1 1) b b ((c c)) 2 2 z z 3 3)

(duplicate '())
; '()
(define (duplicate l)
  (match l
    ((list (list a ...) b ...)      ; nested list
     (cons (duplicate a)
           (duplicate b)))
    ((list a b ...)                 ; flat list
     (cons a
           (cons a
                 (duplicate b))))
    (_                              ; otherwise
     null)))
(duplicate '((a 1) b ((c)) 2 z 3))
; '((a a 1 1) b b ((c c)) 2 2 z z 3 3)

(duplicate '())
; '()