如何设计一个功能内容 输入单个原子列表lat并返回 lat的内容。因此'(a b c a b c d d)的内容是'(a b c d)。
答案 0 :(得分:3)
下面的content
程序可以满足您的需求。
(define (work x y)
(if (null? (cdr x))
(if (in? (car x) y)
y
(cons (car x) y))
(if (in? (car x) y)
(work (cdr x) y)
(work (cdr x) (cons (car x) y)))))
(define (in? x y)
(if (null? y)
#f
(if (equal? x (car y))
#t
(in? x (cdr y)))))
(define (content x) (work x (list)))
过程content
接受列表作为参数。它将列表发送到另一个名为work
的过程。此过程处理列表并将列表中的项添加到新列表中(如果它们不在新列表中)。 work
过程使用另一个名为in
的过程,该过程检查项目是否是列表的成员。
我的解决方案基本上将您的问题分为两个子问题,并使用比原始问题更低抽象级别的过程。
希望有所帮助。
答案 1 :(得分:1)
这是PLT计划解决方案:
(define (is_exists list element)
(cond
[(empty? list) false]
[else
(cond
[(= (first list) element) true]
[else (is_exists (rest list) element)])]))
(define (unique list target)
(cond
[(empty? list) target]
[else
(cond
[(is_exists target (first list)) (unique (rest list) target)]
[else (unique (rest list) (cons (first list) target))])]))
(define (create_unique list)
(unique list empty))
检查:
> (define my_list (cons '1 (cons '2 (cons '3 (cons '2 (cons '1 empty))))))
> my_list
(list 1 2 3 2 1)
> (create_unique my_list)
(list 3 2 1)
答案 2 :(得分:1)
小阴谋家风格怎么样,
(define (rember-all a lat)
(cond
((null? lat) '())
((eq? a (car lat)) (rember-all a (cdr lat)))
(else (cons (car lat) (rember-all a (cdr lat))))))
(define (content lat)
(cond
((null? lat) '())
(else (cons (car lat)
(content (rember-all (car lat) (cdr lat)))))))
答案 3 :(得分:0)
从简单创建传入列表副本的过程开始(非常容易):
(define (unique-elements seq) (define (loop ans rest) (cond ((null? rest) ans) (else (loop (cons (car rest) ans) (cdr rest))))) (loop '() seq))
为了确保输出列表的元素是唯一的,如果REST的负责人已经是ANS的成员,我们应该跳过CONS。所以我们添加另一个条件来做到这一点:
;;; Create list containing elements of SEQ, discarding duplicates. (define (unique-elements seq) (define (loop ans rest) (cond ((null? rest) ans) ((member (car rest) ans) ; *new* (loop ans (cdr rest))) ; *new* (else (loop (cons (car rest) ans) (cdr rest))))) (loop '() seq))
答案 4 :(得分:0)
以下函数接受一个列表并使用递归返回一个新列表,其中只包含其参数的唯一输入:
(defun uniq (list)
(labels ((next (lst new)
(if (null lst)
new
(if (member (car lst) new)
(next (cdr lst) new)
(next (cdr lst) (cons (car lst) new))))))
(next list ())))
正如评论中所提到的,普通的lisp已经具备了这个功能:
(defun uniq (list)
(remove-duplicates list))
答案 5 :(得分:0)
(define (remove-duplicates aloc) (cond ((empty? aloc) '()) (else (cons (first aloc) (remove-duplicates (filter (lambda (x) (cond ((eq? x (first aloc)) #f) (else #t))) (rest aloc)))))))