ここまで書いたけど、なぜか無限ループしてしまう。。。

(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を今読み進めているので、お互い頑張りましょう!><