計算機プログラムの構造と解釈 第二版 P44 問題1.44
いきなり平滑化とかいって、解らない日本語で凹む。
でも説明が本文にかいてあるから、特に気にしないことにする。
この問題の必要な解答は2つ
・入力:ある手続き(f)。出力:平滑化関数を計算する手続き。って感じの手続きsmooth定義
・smoothとrepeatedをつかってn重平滑化関数を作る。(教科書本文の「方法を示せ」ってどういうことだ。。)
smoothはわりかし簡単。
f(x-dx)とf(x)とf(x+dx)をたして3で割るような関数を返してしてやるようにすればいい。
んで、n重平滑化関数の方だけど以下のようの方針にする。
関数名:n-fold-smoothed (<-教科書に書いてある名前ですね。)
入力パラメータ:ある平滑化したい手続きf と 何回平滑化するかの回数n
んーできそうな感じ。
こんな感じでできました。
#!/usr/local/bin/gosh ;; -*- coding: utf-8 -*- (use ggc.debug.trace) (define (inc x) (+ x 1)) (define (square x) (* x x)) (define (compose f g) (lambda (x) (f (g x)))) (define (repeated f n) (if (= n 1) (lambda (x) (f x)) (repeated (compose f f) (- n 1)))) (define dx 0.001) (define (smooth f) (lambda (x) (/ (+ (f (- x dx)) (f x) (f (+ x dx))) 3))) (define (n-fold-smooth f n) ((repeated smooth n) f)) ;; 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) (display dx) (newline) (display ((smooth square) 2)) (newline) ;; (trace square) (display ((n-fold-smooth square 2) 2)) (newline) 0)
実行!!
(inc 6) : 7 (square 7) : 49 ((compose square inc) 6) : 49 ((repeated square 2) 5) : 625 dx : 0.001 ((smooth square) 2)) : 4.000000666666667 ((n-fold-smooth square 4) 2)) : 4.000005333333334
できてん、のか?