続・ニュートン法による平方根の計算

前回エントリーのコードでforループを使ったところを再帰で書いてみました。
あと、Mathクラスを使わないように変更してみました。

import java.io.*;

/**
* ニュートン法による平方根の計算
*
*/
public class Newton {
private static final double EPS = 1.0e-5; // 収束条件
private static double input = 0.0; // 入力値

public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("ニュートン法による平方根を求めます。");
System.out.print("正の実数を入力してください。>>");
input = Double.valueOf(br.readLine()).doubleValue();
if(input == 0.0){
System.out.printf("%6.2fの平方根は%6.2fです。", input, 0.0);
return;
}else if(input < 0){
System.out.println("負の数なので、実数の平方根はありません。");
return;
}
}catch(IOException e){
e.printStackTrace();
}
sqrt(input, 0);
}

private static double sqrt(double new_x, double old_x){

if(abs(new_x - old_x) > EPS){
System.out.printf("%15.8f\n", new_x);
old_x = new_x;
sqrt((old_x + input / old_x) / 2.0, old_x);
}
return new_x;
}

private static double abs(double d){
return (d < 0)? -d : d;
}
}


あと、他の言語でも書いてみようと思ってPythonでも書いてみました。
比較すると、やっぱりコーディング量には違いがでます。
あと、デフォルト引数があるPythonだとインターフェース部分がすっきり書けます。


# encoding: shift_jis
import sys

print "ニュートン法による平方根を求めます。"
print "正の実数を入力してください。>>",
input = float(sys.stdin.readline().strip())

def sqrt(new_x, old_x = 0.0):
if _abs(new_x - old_x) > 0.00001:
print "%15.8f" % new_x
old_x = new_x
sqrt((old_x + input / old_x) / 2.0, old_x)


def _abs(d):
if d < 0:
return -d
else:
return d

sqrt(input)