コード内のどこでも再帰を使用していません。実際、エラーがあり、徹底的にテストしたとは思いません。例えば:
if
条件は(null? ls)
- を使用
list-ref
することは、Schemeでリストをトラバースするときに実行する方法ではありません。そのため、一般に、再帰、、などを使用する必要がありcar
ますcdr
。
- 繰り返しますが、再帰呼び出しはどこにありますか?
compare
いつか呼ばれるべきです!
これはあなたが意図したものだと思います。再帰的ではありませんが、手順を実装する最も簡単な方法です。
(define (compare ls pred?)
(apply pred? ls))
これは宿題のように見えるので、を使用せずに、問題を最初から解決するためのヒントをいくつか提供することしかできませんapply
。空欄に記入してください:
(define (compare ls pred?)
(if <???> ; special case: if the list is empty
<???> ; then return true
(let loop ((prev <???>) ; general case, take 1st element
(ls <???>)) ; and take the rest of the list
(cond (<???> ; again: if the list is empty
<???>) ; then return true
(<???> ; if pred? is false for `prev` and current element
<???>) ; then return false
(else ; otherwise advance the recursion
(loop <???> <???>)))))) ; pass the new `prev` and the rest of the list
let
再帰を実装するためにnamedを使用したことに注意してください。ここでは、再帰プロシージャも使用しています。これは、内部で呼び出されているloop
ことがわかります。または、ヘルパープロシージャを定義することもできます。リストが最初は空であるという特殊なケースを考慮して、これを行う必要がありました。loop
loop
一般的なケースでは、再帰は次のように機能します。2つのパラメーターが必要であり、リスト内の前の要素とリストの残りの部分をprev
格納します。ls
トラバーサルの各ポイントで、前の要素と現在の要素の述語がfalseであるかどうかを確認します。その場合、falseを返します。prev
そうでない場合は、新しい(現在の要素)とリストの残りの部分で再帰を続行します。リストが空になるまでこのように続け、その後、trueを返します。