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