SICP 読み (12)

問題 1.25 は結局分からんまま、スルーに決定。ってーか、問題 1.24 も微妙かも。

問題 1.41

返却された値を再度作用させる、と読むと解は以下か。

(define (double f)
  (lambda (x) (f (f x))))

以下の手続きを机上で見てみる。

(((double (double double)) inc) 5)

(((double (lambda (x) (double (double x)))) inc) 5)

(((lambda (x) (double (double (double (double x))))) inc) 5)

((double (double (double (double inc)))) 5)

((double (double (double (inc (inc))))) 5)

((double (double (inc (inc (inc (inc)))))) 5)

((double (inc (inc (inc (inc (inc (inc (inc (inc))))))))) 5)

((inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc)))))))))))))))) 5)

まだ感覚的に理解できてない感じ。

問題 1.42

手続きを返せば良いか。このあたりは問題に解答が書いてある感じ。

(define (compose f g)
  (lambda (x) (f (g x))))

試験。

guile> ((compose square inc) 6)
49
guile>

問題 1.43

次は手続きを返すのか、と勘違いしてました。
最初、こんな感じにしていた。(正確ではないですが)

(define (repeated f n)
  (lambda (x)
    (let g ((f f) (n n))
	 (cond ((= n 0) f)
	       (else
		(g (compose f f) (- n 1)))))))

compose 自体が lambda な手続きを返すのに、さらに repeated が lambda な手続きを返しているのでおかしいな、と。

guile> (repeated square 2)
#<procedure #f (x)>
guile> ((repeated square 2) 5)
#<procedure #f (x)>
guile> 

で、二重にやってんだ、なナニに気づいて以下のように修正。

(define (repeated f n)
  (let g ((f f) (n n))
    (cond ((= n 0) (lambda (x) 1))
	  ((= n 1) f)
	  (else
	   (g (compose f f) (- n 1))))))

蛇足

問題 1.46 をやりかけたんですが途中で力尽きる。(しかも 44 と 45 スルー)
一応、現時点でスルーなナニを以下に。

  • 1.1、1.2、1.3
  • 1.7、1.8
  • 1.11 〜 15
  • 1.19、20
  • 1.25 〜 30
  • 1.38 〜 40
  • 1.44 〜 46

きちんとやった方が良いんだろうな、と思いつつ 1 章再読してもまだ取りかかってない。スルーしてしまう、という事は違う意味でやるべきなんだろうな、と。