1

リスト内のすべての要素を比較する必要がありますが、方法がわかりません。次に例を示します。

(compare? '(1 x 2 x 3 x 4)) -> #t
(compare? '(1 x 2 x 3 o)) -> #f

2 番目と 4 番目の要素しか比較できません。

(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))が true であること (定義上はそうです) を保証し、その2 xbefore も一致することを意味します。

毎回、リストがどんどん小さくなっていることに注目してください。それができるのは、リストには構造帰納法があるからです。構造誘導のため、実際にはリストの長さを知る必要はありません。アルゴリズムは、基本ケースに到達するまで、ますます小さなサブリストで機能します。


サンプル骨格ソリューション (<???>適切なコードを記入):

(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 に答える