如何在方案中复制列表?

How to duplicate a list in scheme?

以下代码删除了我从 abo-abo 的 answer in this question 获得的列表中的重复项。

(define (remove-duplicates l)
  (cond ((null? l)
         '())
        ((member (car l) (cdr l))
         (remove-duplicates (cdr l)))
        (else
         (cons (car l) (remove-duplicates (cdr l))))))

我刚开始学习scheme,如何复制列表中的每一项,例如(5 6 7 8 9 9 10 11 11)会变成(5 5 6 6 7 7 8 8 9 9 9 9 10 10 11 11 11 11)

如果您有列表l,您可以执行以下操作以在结果列表的开头复制第一项,

(cons (car l) l)

或等效

(cons (car l) (cons (car l) (cdr l)))

这导致以下解决方案:

(define (duplicate l)
  (cond ((null? l)
         '())
        (else
         (cons (car l) (cons (car l) (duplicate (cdr l)))))))

使用 appendlist 的显式递归,以及 foldr 仅使用 cons 的版本:

(define (dup lst)
  (if (empty? lst)
      '()
      (append (list (car lst) (car lst))
              (dup (cdr lst)))))

(define (dup2 lst)
  (foldr (λ (x xs) (cons x (cons x xs)))
         '()
         lst))