計算機プログラムの構造と解釈 第二版 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


できてん、のか?