ウォンツテック

そでやまのーと

SICPの問題を解こう21

問題 1.43

fをn回作用させる手続きを書く問題

(define (repeated f count)                                                      
  (if (= count 1)                                                               
      (lambda (x) (f x))                                                        
      (lambda (x) (f ((repeated f (- count 1)) x)))))                           
(define (square x) (* x x))                                                     
                                                                                
(print ((repeated square 2) 5))                                                 
(print ((repeated square 3) 5))

lambdaの使い方にまだ全然慣れない。。
「Hint: You may find it convenient to use `compose'」compose使えば良かったのか

問題 1.44

smooth手続きを定義してそれをn回行う問題。

(define (repeated f count)                                                      
  (if (= count 1)                                                               
      (lambda (x) (f x))                                                        
      (lambda (x) (f ((repeated f (- count 1)) x)))))                           
(define (smooth f)                                                              
  (define dx 0.0001)                                                            
  (lambda (x) (/ (+ (f (- x dx)) (f x) (f (+ x dx))) 3)))                       
(define (n-smooth f count)                                                      
  ((repeated smooth count) f))                                                  
(define (square x) (* x x))                                                     
                                                                                
(print ((n-smooth square 10) 2.0)) 

最初 (define (n-smooth f count) (repeated (smooth f) count))ってやっててsmoothed-fがcount回行われてが計算されてた。