我需要比较列表中的每个第二个元素,但我不知道如何。这是一个例子:
(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 等......我不知道列表的长度。请帮我。
我需要比较列表中的每个第二个元素,但我不知道如何。这是一个例子:
(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 等......我不知道列表的长度。请帮我。
试试这个答案,填空:
(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
让我们看一下 的例子(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
。由于您在示例中使用了符号,因此它将正常工作。