1

I need to take a number from a list and convert it to a number so that i can pass it as a parameter.

im trying to make a 1-bit adder in scheme. i've written the code for the or gate and the xor gate and also the half adder and now im trying to combine them all to make a full adder. im not sure if im going about it the right way. any input will be appreciated thank you.

(define or-gate
 (lambda (a b)
  (if (= a 1)
    1
    (if (= b 1)
    1
    0))))
(define xor-gate
 (lambda (a b)
  (if (= a b)
    0
    1)))

(define ha
 (lambda (a b)
  (list (xor-gate a b)(and-gate a b))))

(define fa
 (lambda (a b cin)
  (or-gate (cdr(ha cin (car (ha a b))))(cdr(ha a b)))))

the issue i get when i run the program is that the half adder (ha) function outputs a list as a value and that makes the values incompatible with my other procedures because they require numbers and not lists. i feel like there is a simple solution but i dont know it.

4

2 に答える 2

2

契約があれば、コードを読むのがずっと簡単になります。半加算器がビットのリストを返していると推測するのにかなりの時間がかかりました。

次に、「cdr」に関する単純な問題があるように見えます。「cdr」演算子は、リストの 2 番目の要素ではなく、リストの「残り」を返します。(cdr (list 1 1)) と 1 の違いを確認してください。1 つ目は 1 を含むリストを生成し、2 つ目は数値 1 を生成します。

于 2012-04-06T06:56:41.267 に答える
0

混乱を避けるために、リストの最初の要素と 2 番目の要素にそれぞれアクセスするために、 firstandのsecond代わりにcarandを使用することをお勧めします。リストの 2 番目の要素を返すのではなく、別リストである残りcadrのリストを返すことに注意してください。cdr

とにかく、fa質問の手順は私には正しくありません。と の両方の値を含むリストを返す必要がsumありcoutます。提案されているようにfirstandを使用して、それを実装する1つの可能な方法を次に示します。second

(define fa
  (lambda (a b cin)
    (list (first (ha a (first (ha b cin))))
          (or-gate (second (ha a (first (ha b cin))))
                   (second (ha b cin))))))

...しかし、それは紛らわしいようです。3 つの部分で計算していることに注意してください。(ha b cin)次のように、繰り返し計算を変数に保存することをお勧めします。

(define fa
  (lambda (a b cin)
    (let* ((partial1 (ha b cin))
           (partial2 (ha a (first partial1))))
      (list (first partial2)
            (or-gate (second partial2) (second partial1))))))

最後に、本SICPには、デジタル回路のシミュレーターの一部として加算器の非常に優れた実装があります。コードを改善する方法に関するさらなるアイデアについては、それを参照してください

于 2012-04-06T16:04:28.383 に答える