1
(define (even x)  (= (modulo x 2) 0))
(define (twice x) (* x 2))
(define (half x)  (/ x 2))  

(define (rfmult a b)
    (cond ((= 0 a) 0)
          ((= 0 b) 0)
          ((even a) (twice (rfmult (half a) b)))
          (else     (+ b (twice (rfmult (half (- a 1)) b))))))

私はそれ(rfmult 3 4)が呼び出され、elseステートメントがトリガーされ、その後(- 3 1)が行わaれ、半分にカットされるので、それが になるという理解に至りました(rfmult 1 4)。この時点で、2 を掛けると終わらないので迷います。頭の中でしか理解できないようです。

4

2 に答える 2

1

私はそれを理解したと思う......それで電話しましょう(rfmult 100 5)

  1. これにより、(rfmult (100/2 5) が呼び出されます。
  2. (50/2 5)※2
  3. ((25-1)/2 5) *2
  4. (12/2 5) * 2 + b
  5. (6 5)※2
  6. (3 5)※2
  7. ((3-1)/2 5) *2
  8. (1 5)*2 + b
  9. 0!

次に、再帰を上方向に追跡します。

したがって、(1 5) ブロックでは、5*2 + 5=15 であるため、b 値は 15 になります。

すると、(3 15) ブロック b は 15 *2 = 30 となります。

そうすると、(6 30) b は 30 * 2 = 60 になります。

すると、 (12 60) 60*2 + 5 = 125

(25 125) 125 * 2 => 250

(50 250) の最初の呼び出しに戻ります。ここで、250*2 = 500 であり、これは 5*100 の解です...

これが間違った思考プロセスである場合は、私を修正してください! 私はこの再帰的構造に約 2 時間座っていて、それが理にかなっているのを見て興奮しています!

于 2013-09-28T20:59:02.463 に答える