SICPを読む(63) 問題 2.45 ラムダ再帰を返したい。

引き続き図形言語。

問題 2.45

(define (split parent child)
  (define (iter painter n)
    (if (= n 0)
        painter
        (let ((smaller (iter painter (- n 1))))
          (parent painter (child smaller smaller)))))
  iter)

問題は解けたけど、iterを使わず、ラムダ再帰を返したい。

ちょっと待て。ラムダは無名関数だから・・・無名関数を再帰?

アレ?なんか違う!?

ちと調べてみる。


letrec法。

(define (split parent child)
  (letrec ((iter
             (lambda (painter n)
               (if (= n 0)
                   painter
                   (let ((smaller (iter painter (- n 1))))
                     (parent painter (child smaller smaller)))))))
    iter))

変わってねぇ〜。


名前付let法。

(define (split parent child)
  (lambda (painter n)
    (let iter ((n n))
      (if (= n 0)
          painter
          (let ((smaller (iter (- n 1))))
            (parent painter (child smaller smaller)))))))

ちょっとすっきり?

  • わかったこと
    • 名前が無ければ再帰は出来ない。
  • ちなみに
    • JavaScriptだと、arguments.callee()で無名関数の再帰が可能らしい。イイナ。

追記

ソレって・・・Y・・・。