さかもとのブログ

つらつらと

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. 1つ目のlambda式をAとする
  2. 2つ目のlambda式をBとする
  3. 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以下の式が評価・実行される

といった感じ.