1

我需要比较列表中的每个第二个元素,但我不知道如何。这是一个例子:

(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 等......我不知道列表的长度。请帮我。

4

2 回答 2

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
于 2012-11-21T18:41:15.710 回答
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。由于您在示例中使用了符号,因此它将正常工作。

于 2012-11-21T18:18:12.003 回答