比较列表中的元素

时间:2012-11-21 16:50:33

标签: scheme

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

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

2 个答案:

答案 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时,此解决方案才能正常运行。由于您在示例中使用了符号,因此它可以正常工作。