計算機プログラムの構造と解釈 第二版 P40 問題1.36

まず日本語をよくよむ。
求められているのは3つ

0. fixed-pointを印字するようにする
1. x^x = 1000 の解を見つける。
2. ステップ数を調べて、平均緩和の時と比べる。


0.
近似値を印字するには、
tryの実行のタイミングで、表示するようにしてみる。


1.
これは、問題に書いてあるように

次にx → log(1000)/log(x)の不動点を探索することで、


2.
平均緩和を使うには、
両辺にxをたして、両辺を2で割ればいい


んで、ソース

#!/usr/local/bin/gosh
;; -*- coding: utf-8 -*-

(define (close-enough? x y)
  (< (abs (- x y)) 0.001))


(define tolerance 0.00001)


(define (fixed-point f first-guess)
  (define (close-enough? v1 v2) 
    (< (abs (- v1 v2)) tolerance))
  (define (try guess)
    ;ここ変更
    (display guess)(newline)
    (let ((next (f guess)))
      (if (close-enough? guess next)
        next
        (try next))))
  (try first-guess))


;; main
(define (main args)

  (display "平均緩和を使ったとき")(newline)
  (display (fixed-point (lambda (x) (/ (+ x (/ (log 1000) (log x))) 2.0)) 2.0) )
  (newline)(newline)

  (display "平均緩和でない方")(newline)
  (fixed-point (lambda (x) (/ (log 1000) (log x))) 2.0)
  (newline)(newline)

0)


実行

平均緩和を使ったとき
2.0
5.9828921423310435
4.922168721308343
4.628224318195455
4.568346513136242
4.5577305909237005
4.555909809045131
4.555599411610624
4.5555465521473675
4.555537551999825

平均緩和でない方
2.0
9.965784284662087
3.004472209841214
6.279195757507157
3.759850702401539
5.215843784925895
4.182207192401397
4.8277650983445906
4.387593384662677
4.671250085763899
4.481403616895052
4.6053657460929
4.5230849678718865
4.577114682047341
4.541382480151454
4.564903245230833
4.549372679303342
4.559606491913287
4.552853875788271
4.557305529748263
4.554369064436181
4.556305311532999
4.555028263573554
4.555870396702851
4.555315001192079
4.5556812635433275
4.555439715736846
4.555599009998291
4.555493957531389
4.555563237292884
4.555517548417651
4.555547679306398
4.555527808516254
4.555540912917957

平均緩和を使うと、10ステップ
平均緩和を使わないと、34ステップ