SICPを読む(10) 問題1.9 - 1.10 指数的爆発
問題1.9
紙の上で展開した。散々悩んだので、あっさり解けた。
問題1.10
数学的帰納の問題。
プログラムを見て、数学的定義を述べよ。
(define (A x y) (cond ((= y 0) 0) ((= x 0) (* 2 y)) ((= y 1) 2) (else (A (- x 1) (A x (- y 1))))))
xに大きな値を取ると大変な事になることだけわかった。x = 3以降の動きが異常すぎるのだ。尋常じゃない。僕の少ない頭では、数学的定義がわからなかった。
丁寧な解説がありました。
- SICP memo: 問題1.10 - わかりやすい。
- アッカーマン関数 - Wikipedia - うは、なんだコレ。
なるほど・・・指数的爆発を起こすはずです・・・。後でもう一度解きたい問題。
追加問題
ひげぽん OSとか作っちゃうかMona- - 関数型言語の勉強にSICPを読もう - (7) 1章 - 反復をマスターしたいけど・・・
ひげぽんの問題もやってみた。
1からnまで数えよう!
; 再帰版 (define (sum n) (if (= n 1) 1 (+ n (sum (- n 1))))) (sum 10) ; 55 ; 反復版 (define (sum n) (define (iter s i) (if (> i n) s (iter (+ s i) (+ i 1)))) (iter 0 1)) (sum 10) ; 55
おぉぉぉ。スムーズに解けた。先人がいるというのはありがたい。
- 再帰のポイントは(n - 1)で考える。
- 反復のポイントは、+の位置。
しかし、1からnまで計算するのに繰り返しは要らない。
(define (sum n) (/ (* (+ n 1) n) 2)) (sum 10) ; 55