【发布时间】:2011-01-23 15:47:29
【问题描述】:
只是想再次回到方案的摇摆中,因为每个人都喜欢递归..(mhhmnmm。)
总是试图返回 #t 或 #f 以确定列表中的所有元素是否都是唯一的。
比较第一个元素和第二个元素没问题。它正在递归地继续..
(define (unique ls)
(if (null? ls) #t
(equal? (car ls)(car(cdr ls)))))
【问题讨论】:
只是想再次回到方案的摇摆中,因为每个人都喜欢递归..(mhhmnmm。)
总是试图返回 #t 或 #f 以确定列表中的所有元素是否都是唯一的。
比较第一个元素和第二个元素没问题。它正在递归地继续..
(define (unique ls)
(if (null? ls) #t
(equal? (car ls)(car(cdr ls)))))
【问题讨论】:
我将编写一个不同的、更简单的函数来演示循环。希望在这和你所拥有的之间,你会到达那里。 :-)
(define (member x lst)
(cond ((null? lst) #f)
((equal? x (car lst)) lst)
(else (member x (cdr lst)))))
另一个例子:
(define (assoc x alist)
(cond ((null? alist) #f)
((equal? x (caar alist)) (car alist))
(else (assoc x (cdr alist)))))
【讨论】:
您的(equal?) 调用不完整。如果头部和尾部相等,那么“unique”的值为false。如果它们不相等,那么您将返回应用于列表尾部 (cdr) 的 unique 的值。
(在您的原型实现中暗示您正在检查预先排序的列表。如果没有,那么这是另一个步骤。)
【讨论】:
(use srfi-1)
(define (unique? ls) (eq? (length ls) (length (delete-duplicates ls))))
【讨论】: