問題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とは関係なさそうなので飛ばす。