SICP : Ex1.35 : Java

[id:lethevert:20060108:p4]
不動点を求める問題

abstract class FixedPoint<R> {
  abstract R f(R x);
  abstract boolean closeEnough(R a, R b);
  R solve(R guess) {
    R next = f(guess);
    while (!closeEnough(next, guess)) {
      guess = next;
      next = f(guess);
    }
    return next;
  }
}

public class Main {
  public static void main(String[] args) {
    FixedPoint<Double> fix = new FixedPoint<Double>() {
      Double f(Double x) { return 1.0 + 1.0 / x;}
      boolean closeEnough(Double a, Double b) {
        return tolerance > (a>b?a-b:b-a);
      }
      final double tolerance = 0.0000000001;
    };

    System.out.println(fix.solve(1.0));
  }
}

これは非常に「らしい」コードになりました。クラスにまとめたことによってモジュール化されて分かりやすくなっているように思います。