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); } }