の例を見てみましょう(compare? '(1 x 2 x 3 x 4))
。
(compare? '(2 x 3 x 4))
それが真であり、その1 x
前も一致することを確認する必要があります。
つまり、それ(compare? '(3 x 4))
が true であること (定義上はそうです) を保証し、その2 x
before も一致することを意味します。
毎回、リストがどんどん小さくなっていることに注目してください。それができるのは、リストには構造帰納法があるからです。構造誘導のため、実際にはリストの長さを知る必要はありません。アルゴリズムは、基本ケースに到達するまで、ますます小さなサブリストで機能します。
サンプル骨格ソリューション (<???>
適切なコードを記入):
(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
。例ではシンボルを使用しているため、正しく機能します。