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)
ちょっと待て。ラムダは無名関数だから・・・無名関数を再帰?
アレ?なんか違う!?
ちと調べてみる。
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・・・。