2

ここのより高度な計画者のほとんどにとっておそらく些細な質問ですが、新参者として、私はこれが問題であることに気づきました。

入ったときと同じ順序で新しいリストを作成する方法が必要です。例として、リスト'(1 2 0 3 4 0 0 5)が与えられたとします。ただし、リストをトラバースし、最初の引数としてcdrを返すと、新しいリストが逆方向に作成されます。

コードの例を次に示します。

作業が必要な「古いリスト」と、作成して返す「新しいリスト」としての空のリストを渡します。

0を削除することは、新しいリストが満たさなければならない「何らかの条件」としてここにあることに注意してください

  (define (form-new-list old-list new-list)
    (cond ((null? old-list) new-list)
          (else
           (if (eq? (car old-list) 0) (form-new-list (cdr old-list) new-list)
               (form-new-list (cdr old-list) (cons (car old-list) new-list))))))

  ;test
  (form-new-list '(1 2 0 3 4 0 0 5) '()) ; gives (5 4 3 2 1)
  ;but want (1 2 3 4 5)

逆の手順で返されるリストを逆にするだけでなく、最初に新しいリストを正しい順序でまとめたいと思います。

おそらくどこか別の場所で再帰呼び出しを行うような、これに対するある種の「トリック」はありますか?

アドバイスをいただければ幸いです。

4

1 に答える 1

5

再帰を使用してリストをトラバースする自然な方法を探しています。この手順をソリューションのテンプレートとして使用します。受信したとおりにリストをコピーするだけです。

(define (copy lst)
  (if (null? lst)
      '()
      (cons (car lst)
            (copy (cdr lst)))))

次の点に注意してください。

  • 入力リストがnullの場合、再帰は終了します。新しいリストを作成している場合、返される正しい値はnullリストです。
  • 新しいリストを作成することに関心があります。これを行うconsには、出力リストの新しい要素を作成します。この場合、これは入力リストの最初の要素(そのcar一部)になります。
  • 最後に、再帰ステップは、入力リストの残りの部分(そのcdr一部)を使用してプロシージャを呼び出すことによって進みます。

いつものように、私は、 TheLittleSchemerまたはHowtoDesign Programsのいずれかを参照することをお勧めすることで、再帰的に考える方法を学ぶ人々への答えになります。どちらの本も、Schemeを使用して再帰プロセスを一般的に理解する方法を教えます。

于 2012-11-06T02:11:50.510 に答える