SICPを読む(14) 問題1.17 - 1.19 変換がわからない・・・

a <- b の変換がうまくいかない。

問題1.17

あっさり解けた。

(define (double x) (* x 2))
(define (halve x) (/ x 2))

(define (mul a b)
 (cond ((= b 0) 0)
       ((even? b) (+ a (double (mul a (halve x)))))
       (else (+ a (mul a (- b 1))))))

問題1.18

1.17を反復にする問題。簡単だと思っていたのに、いくら考えても答えに辿り着かない。答えを見た。

SICP memo: 問題1.18
product ← product そのまま

なるほど。2で割り切れなくなるまで、合計をキャッシュしておけばよかったのか。

合計を足してたので答えに辿り着かなかった。悔しい。

(define (mul a b)
 (define (iter a b sum)
  (cond ((= b 0) sum)
        ((even? b) (iter (double a) (halve b) sum))
        (else (iter a (- b 1) (+ sum a)))))
 (iter a b 0))

Vim++MzScheme+traceを導入してみた。Gaucheより見やすい。

3 * 20の計算の場合、

|(iter 3 20 0)
|(iter 6 10 0)
|(iter 12 5 0)
|(iter 12 4 12)
|(iter 24 2 12)
|(iter 48 1 12)
|(iter 48 0 60)
|60
60
  • 3 * 20だと、
  • 2で割り切れなくなるまでaを2倍して、bを2分する。
  • 12 * 5になる。(この時点まで、足さないのがポイント!!)
  • 12 * 4 + 12として、
  • 繰り返す。

割り切れなくなったら、外に追い出す感じ。

僕の頭の中に、こういう発想は全然無かった。

後でもう一度解こうと思う。

問題1.19

変換がわからなくなってきたので、飛ばそうと思う。

解答も見ないことにする。

まとめ

  • 同類の問題は解けるけど、応用問題に弱いことが判明してきた。
  • イナリサーチの初歩段階なんだけど、つまずいている自分がいて情けない。