計算機プログラムの構造と解釈 第二版 P44 問題1.43
問題を読む。
これもたいしたことなさそうだ。
要は、指定した回数ある手続きを繰り返して実行してくれる
そんな「手続き」を返す
手続きを作ればいいんだ。
そんで、前の章で作ったcomposeも使わないといけないようなので、
それも考慮に入れる。
んで、こんなかんじだ。
#!/usr/local/bin/gosh ;; -*- coding: utf-8 -*- (define (inc x) (+ x 1)) (define (square x) (* x x)) (define (compose f g) (lambda (x) (f (g x)))) (define (repeated f n) (lambda (x) (define (repeated-i value num) (cond ((= num 0) value) ((>= num 2) (repeated-i ((compose f f) value) (- num 2))) (else (repeated-i (f value) (- num 1))))) (repeated-i (f x) (- n 1)))) ;; main (define (main args) (display "(inc 6) : ") (display (inc 6)) (newline) (display "(square 7) : ") (display (square 7)) (newline) (display "((compose square inc) 6) : ") (display ((compose square inc) 6)) (newline) (display "((repeated square 2) 5) : ") (display ((repeated square 2) 5)) (newline) 0)
実行
(inc 6) : 7 (square 7) : 49 ((compose square inc) 6) : 49 ((repeated square 2) 5) : 625
できてると思う。
追記(2009/04/23)
repeatedの関数だけど、もっといい書き方を思いついたので。書いておきます。
(define (repeated f n) (if (<= n 1) (lambda (x) (f x)) (repeated (compose f f) (- n 1))))