2

リストで再帰を使用しようとしていますが、すべての要素を調べる必要があります。これが私のコードです:

(define compare
  (lambda (ls pred?)
    (if (null? list)
        #f
        (pred? (list-ref ls (- (length ls) 2)) (list-ref ls (- (length ls) 1))))))

ただし、最後の2つの要素でのみ機能します。結果は次のようになります。

(compare '(1 2 3 4 5) <) -> #t
(compare '(1 2 8 4 5) <) -> #f

私が何をすべきか分かりますか?

4

1 に答える 1

3

コード内のどこでも再帰を使用していません。実際、エラーがあり、徹底的にテストしたとは思いません。例えば:

  • 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ことがわかります。または、ヘルパープロシージャを定義することもできます。リストが最初は空であるという特殊なケースを考慮して、これを行う必要がありました。looploop

一般的なケースでは、再帰は次のように機能します。2つのパラメーターが必要であり、リスト内の前の要素とリストの残りの部分をprev格納します。lsトラバーサルの各ポイントで、前の要素と現在の要素の述語がfalseであるかどうかを確認します。その場合、falseを返します。prevそうでない場合は、新しい(現在の要素)とリストの残りの部分で再帰を続行します。リストが空になるまでこのように続け、その後、trueを返します。

于 2012-11-24T12:42:01.120 に答える