2015/12/27
SICP 問題 4.21
;; a
以下の式が階乗を計算すること確かめた後,フィボナッチ数を計算する手続きを作る.
((lambda (n)
((lambda (fact)
(fact fact n))
(lambda (ft k)
(if (= k 1)
1
(* k (ft ft(- k 1)))))))
10)
gosh> ((lambda (n)
((lambda (fact)
(fact fact n))
(lambda (ft k)
(if (= k 1)
1
(* k (ft ft (- k 1)))))))
10)
3628800
;; フィボナッチ数
((lambda (n)
((lambda (fact)
(fact fact n))
(lambda (ft k)
(cond ((= k 0) 0)
((= k 1) 1)
(else (+ (ft ft (- k 1))
(ft ft (- k 2))))))))
10)
;; 確認用の手続き
(define (make-map-list n start proc)
(map proc (iota n start 1)))
gosh> (make-map-list 10 1 (lambda (n)
((lambda (fact)
(fact fact n))
(lambda (ft k)
(cond ((= k 0) 0)
((= k 1) 1)
(else (+ (ft ft (- k 1))
(ft ft (- k 2)))))))))
(1 1 2 3 5 8 13 21 34 55)
;; b
以下の式をaと同じように内部定義もletrecも使わずに定義する.
(define (f x)
(define (even? n)
(if (= n 0) true (odd? (- n 1))))
(define (odd? n)
(if (= n 0) false (even? (- n 1))))
(even? x))
;; 答え
(define (f x)
((lambda (even? odd?)
(even? even? odd? x))
(lambda (ev? od? n)
(if (= n 0) true (od? od? ev? (- n 1))))
(lambda (od? ev? n)
(if (= n 0) false (ev? ev? od? (- n 1))))))
gosh> (f 4)
#t
gosh> (f 5)
#f
問題文と引数の順序が違っていたので書き直し.
(define (f x)
((lambda (even? odd?)
(even? even? odd? x))
(lambda (ev? od? n)
(if (= n 0) true (od? ev? od? (- n 1))))
(lambda (ev? od? n)
(if (= n 0) false (ev? ev? od? (- n 1))))))
gosh> (f 4)
#t
gosh> (f 5)
#f