問題1.17 でいつもどおりわからなくなる
ここまで書いたけど、なぜか無限ループしてしまう。。。
(define (even? n) (= (remainder n 2) 0)) (define (double n) (* n 2)) (define (halve n) (/ n 2)) (define (* b n) (cond ((= n 0) 1) ((even? n) (double (* b (halve n)))) (else (* b (* b (- n 1)))))) (* 5 3)
しょうがないので回答を調べてながら
修正してみる
参考:http://www.serendip.ws/archives/373
(define (even? n) (= (remainder n 2) 0)) (define (double n) (+ n n)) ;←ここがダメだった (define (halve n) (/ n 2)) (define (* b n) (cond ((= n 0) 0) ((even? n) (* (double b) (halve n))) ;←ここもだめだった (else (+ b (* b (- n 1))))));←ここもね (require (lib "trace.ss")) (trace *) (* 5 4)
何とか動きました。。。orz
COMMENT: AUTHOR: moremagic IP: 219.165.77.111 date: 2013-06-09T06:44:07.000Z
コメントありがとうございます。
アドバイスありがとうございます。
確かに回答しか書いてないので、これじゃあよくわかんないですね
反省^^;
再帰処理苦手だという意識はなかったのですが
Lispでのデバックに慣れていなくて、結構手こずっています。
再帰処理苦手なのかもw
SICP 何度も挫折しているので
今回は何とか最後まで行きたいなぁとおもってるです。
COMMENT: AUTHOR: ayato0211 EMAIL: lumia@nandeger.com URL: http://d.hatena.ne.jp/ayato0211/ IP: 180.0.101.7 date: 2013-06-08T08:51:39.000Z
問題1.17に限らずですが、分かっていることを整理した方が良いと思います。
(「いかにして問題をとくか」などにも書いてあります)
■1.17で分かっていた情報
・加算はあるが乗算はない(つまり、*は未定義だとしている)
・p24,25で書いたexpt手続きと似ている
・整数を2倍するdouble演算と、偶数の整数を2で割るhalve演算がある
・p25のfast-expt手続きと類似の手続きとあるので、nが偶数と奇数のときで処理が違うことが分かる。(対数的ステップ数)
;;nが偶数のとき
b * n = 2 * (b * (n / 2))
;;nが奇数のとき
b * n = b + (b * (- n 1))
なので、これを書きなおして回答のようになるのかなーと。
あと他の幾つかのSICPの問題解いてるの読みましたが、もしかしたら再帰処理が苦手だったりするんじゃないでしょうか?
余計なお世話かもしれませんが、もし再帰などに慣れていないようなら「Scheme手習い」を一度読まれることをオススメします。
http://d.hatena.ne.jp/ayato0211/20130305/1362455379
僕もSICPを今読み進めているので、お互い頑張りましょう!><
moremagic
2013-06-06