如何复制方案中的列表?

时间:2015-11-05 07:39:57

标签: 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))))))

我刚刚开始学习计划,如何复制列表中的每个项目,例如(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)

2 个答案:

答案 0 :(得分:1)

如果你有一个列表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)))))))

答案 1 :(得分:1)

appendlistfoldr版本与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))