SICP演習問題4.21
今回は簡単だった.
しかし,こんな考え方もあるのかーと思ってしまった.
;;a ((lambda (n) ((lambda (fact) (fact fact n)) (lambda (ft k) (if (= k 1) 1 (* k (ft ft (- k 1))))))) 10) ((lambda (n) ((lambda (fibonacci) (fibonacci fibonacci n)) (lambda (fib k) (cond [(= k 0) 0] [(= k 1) 1] [(+ (fib fib (- k 2)) (fib fib (- k 1)))])))) 10) ;;b (define (f x) (define (even? n) (if (= n 0) #t (odd? (- n 1)))) (define (odd? n) (if (= n 0) #f (even? (- n 1)))) (even? x)) (define (f x) ((lambda (even? odd?) (even? even? odd? x)) (lambda (ev? od? n) (if (= n 0) #t (od? ev? od? (- n 1)))) (lambda (ev? od? n) (if (= n 0) #f (ev? ev? od? (- n 1))))))
解説
((lambda (n) ((lambda (fact) (fact fact n)) (lambda (ft k) (if (= k 1) 1 (* k (ft ft (- k 1))))))) 10)
を使って自分用に解説.
- 1つ目のlambda式をAとする
- 2つ目のlambda式をBとする
- 3つ目のlambda式をCとする
以下が解説
- Aの本体は,B以下の式
- Bの本体は(fact fact k)で引数factに渡されるのは, C
- Bの引数factにはCがは入り,(fact fact k)でCがC自身とkを引数にとり,呼び出される
- Cではif文の判定が行われ,kが1でない場合,(* k (ft ft (- k 1)))が呼び出される
- ftはC自身なので,(ft ft (- k 1))では,CがC自身と(- k 1)を引数にとり,呼び出される
- Aの引数nに10が渡り,B以下の式が評価・実行される
といった感じ.