在球拍中打印列表元素

时间:2015-09-17 01:35:45

标签: 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 
(lambda (mylist)
(duplicate-list mylist 0)))

这段代码中的问题是,只有当我给它一个列表作为输入时它才能正常工作,当我给它一个嵌套列表的输入时,这就无法工作。

>(duplicate '(a 1 b 2 c 3 r x)) ->  a a 1 1 b b 2 2 c c 3 3 r r x x
>(duplicate '( (a 1) b ((c)) 2)) ->((a 1) (a 1) b b ((c)) ((c)) 2 2)

然而,所需的预期结果应为

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

2 个答案:

答案 0 :(得分:2)

您使用错误的方法构建输出列表,您必须重复carcdr部分,因为这是列表。试试这个:

(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)

答案 1 :(得分:0)

这是另一种通过match使用模式匹配的解决方案-

(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 '())
; '()