4

再帰を使用してリストを作成し、そのリストをベースケースに返す方法に頭を悩ませています。具体的には、2つの32ビット数値(x1とx2)をALUに入力し、それらをビットごとに(ALU1を介して)評価してから、結果の数値のリストを作成します。この再帰アルゴリズムの基本ケースは(null?x1)ですが、この時点で、結果のリストにアクセスするにはどうすればよいですか?スキーム内のリストは不変であることを知っているので、空のリストを作成して、結果のリストをそれに追加することはできません。何か助けはありますか?関数型プログラミングは初めてですので、よろしくお願いします。

(define ALU-helper 
   (lambda (selection sub x1 x2 carry-in n)
      (if (null? x1)
          (________?)
          (cons
              (ALU1 selection sub (car x1) (car x2) carry-in n) 
              (ALU-helper selection sub (cdr x1) (cdr x2) carry-in (- n 1))))))
4

4 に答える 4

5

との両方がまったく同じ長さであると仮定すると、これは機能するはずx1です。x2

(define ALU-helper 
  (lambda (selection sub x1 x2 carry-in n)
    (if (null? x1)
        '()
        (cons
         (ALU1 selection sub (car x1) (car x2) carry-in n) 
         (ALU-helper selection sub (cdr x1) (cdr x2) carry-in (- n 1))))))

入力リストで再帰を実行し、結果として新しい出力リストを作成する場合、基本ケースはif (null? lst)空のリストを返します'()consこれは、新しい要素を作成するときに、結果のリストが各ステップで構築されているためです。入力リストの最後の要素に到達すると、すでに出力リストが作成されており、あとはリストの終わりマーカー を返すだけです'()

より明確に理解するために、より単純な例を試してみてください。このプロシージャは、入力として受け取ったリストを単純にコピーします。

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

(copy '(1 2 3 4 5))
> (1 2 3 4 5)

2 つのリストを同時にトラバースしているため、ここでも基本ケースがif (null? lst)であり、再帰ステップconsがリストの現在の要素である(car lst)ことに注意してください。(cdr lst), the rest of the list. In your case, you perform

于 2012-04-08T14:48:26.913 に答える
0

おそらく、空のリストが必要なだけで、 と書かれてnullいます。そう:

(if (null? x1)
    null
    (cons ...))
于 2012-04-08T13:40:56.180 に答える
-1

再帰-これが比喩です。

あなたが家を引っ越していると想像してください。あなたはシフトする必要があるものをたくさん持っています、そしてあなたはそれが新しい家に到着することを確実にする必要があります。

たくさんの友達にトラックをいっぱいにしてもらいましょう。彼らは助けることができる他の友達がいるでしょう。ホースの人々は他の友人などを持っているでしょう。それが1人の人があなたのものの少しをトラックにふるいにかけることに要約されるまで。

今、各人は、より多くの前にトラックに何があるかをあなたに伝えるために少しの紙を持っています。これで、それらの紙片を選択してリストを作成できます。

于 2012-04-08T08:43:18.970 に答える