我需要比较列表中的每一个元素,但我不知道如何。这是一个例子:
(compare? '(1 x 2 x 3 x 4)) -> #t
(compare? '(1 x 2 x 3 o)) -> #f
我只能比较第二和第四个元素:
(define compare?
(lambda (list)
(equal? (cadr list) (cadddr list))))
我需要6号,8号,10号等......我不知道列表的长度。求你帮帮我。
答案 0 :(得分:2)
尝试这个答案,填写空白:
(define (compare? lst)
(if <???> ; if the list has at most two elements
#t ; then return true
(let ((elt (cadr lst))) ; grab the first element to be compared
(let loop ((lst (cddr lst))) ; step on the second group of elements
(cond (<???> #t) ; if there's only one or zero elements left
(<???> #f) ; if the second element is not equal to `elt`
(else (loop (cddr lst)))))))) ; otherwise continue iterating
答案 1 :(得分:0)
让我们看一下(compare? '(1 x 2 x 3 x 4))
的例子。
您希望确保(compare? '(2 x 3 x 4))
为真,并且之前的1 x
也匹配。
那意味着您要确保(compare? '(3 x 4))
为真(根据定义,它),并且之前的2 x
也匹配。
注意我们每次使用越来越小的列表。我们可以这样做,因为列表具有结构感应。由于结构感应,您实际上不必知道列表的长度。该算法适用于越来越小的子列表,直到遇到基本情况。
示例骨架解决方案(使用合适的代码填写<???>
):
(define (compare? lst)
(if (or (null? lst) (null? (cdr lst)))
#t
(let ((item (cadr lst))
(next (compare? (cddr lst))))
(case next
((#f) <???>)
((#t) <???>)
(else (and <???> <???>))))))
(从技术上讲,#f
条款不是必需的,但是,它可以使您更清楚解决方法应该是什么。)
只有列表中匹配的广告位不是#t
或#f
时,此解决方案才能正常运行。由于您在示例中使用了符号,因此它可以正常工作。