SICP : Ex1.38 : Java

[id:lethevert:20060124:p6]
オイラー展開で自然対数の底 e を求める問題。

abstract class ContFrac<A> {
  abstract A zero();
  abstract A n(int k);
  abstract A d(int k);
  abstract A add(A a, A b);
  abstract A div(A a, A b);
  A solve(int n) {
    A ret = zero();
    for(int i=n-1; i>=0; --i){
      ret = div(n(i), add(d(i), ret));
    }
    return ret;
  }
}

abstract class ContFracReal extends ContFrac<Double> {
  Double zero() { return 0.0;}
  Double add(Double a, Double b) { return a+b;}
  Double div(Double a, Double b) { return a/b;}
}

public class Main {
  public static void main(String[] args) {
    ContFracReal euler = new ContFracReal() {
        Double n(int k) { return 1.0;}
        Double d(int k) {
          if (k % 3 == 1) {
            return 2.0*(k/3+1);
          }else{
            return 1.0;
          }
        }
      };

    System.out.println(euler.solve(10000)+2.0);
  }
}