問題1.11
;再帰 (define (f n) (if (< n 3) n (+ (f (- n 1)) (* 2 (f (- n 2))) (* 3 (f (- n 3)))))) ;反復 (define (f x) (define (iter p pp ppp count) (if (< count 3) p (iter (+ p (* 2 pp) (* 3 ppp)) p pp (- count 1)))) (if (< x 3) x (iter 2 1 0 x)))
1.12
;y行目のx個目の数を求める。 (define (pascals-triangle y x) (if (or (= x 1) (= x y)) 1 (+ (pascals-triangle (- y 1) (- x 1)) (pascals-triangle (- y 1) x)))) ;(pascals-triangle 5 3) -> 6 ;(pascals-triangle 6 4) -> 10 ;再帰が二つになるといきなり難しい。 ;おまけ1,辺の和を計算する。 (define (sum-y x) (define (iter-sum-y y x) (if (= x 0) 0 (+ (iter-sum-y y (- x 1)) (pascals-triangle y x)))) (iter-sum-y x x)) ;(sum-y 10) -> 512 ;(sum-y 20) -> 524288 ;(sum-y 30) -> 帰ってこない・・・ ;おまけ2,辺の数xの三角形すべての和を計算する。 (define (sum-pt x) (if (= x 0) 0 (+ (sum-pt (- x 1)) (sum-y x)))) ;(sum-pt 10) -> 1023 ;(sum-pt 20) -> 1048575 ;(sum-pt 30) -> 帰ってこない・・・ ;おまけ2+1,違う方法もある・・・ (define (new-sum-pt x) (define (iter-new-sum-pt x) (if (<= x 1) 1 (* 2 (iter-new-sum-pt (- x 1))))) (- (* (iter-new-sum-pt x) 2) 1)) ;(new-sum-pt 4) -> 15 ;(new-sum-pt 10) -> 1023 ;(new-sum-pt 30) -> 1073741823 ;(new-sum-pt 1234) -> 295811224608098629060044695716103590786339687135372992239556207050657350796238924261053837248378050186443647759070955993120820899330381760937027212482840944941362110665443775183495726811929203861182015218323892077355983393191208928867652655993602487903113708549402668624521100611794270340232766099317098048887493809023127398253860618772619035009883272941129544640111837183 ;やはり美しさより効率性なのか。
1.13
この問題は意味わからない。
lispとは関係なさそうなので飛ばす。