如何在方案中复制列表?
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)))))))
使用 append
和 list
的显式递归,以及 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))
以下代码删除了我从 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)))))))
使用 append
和 list
的显式递归,以及 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))