//x的平方根
/*
* 在不使用sqrt(x)的情况下,得到x的平方根的整数部分
* */
public class P8 {
public static void main(String[] args) {
System.out.println(newton(12));
}
//牛顿迭代
/*
* 跟微积分有关, y = x平方,是一个y轴对称的二次函数
* y/x = x,回想一下P3中12的(2*6) (3*4) (4*3) (6*2)
* 关于 (根号12 * 根号12)对称,y/x=根号12,x=根号12
* 并且前后两个数的平均值会比前后两个数更接近结果
* 如 2的平方=4,6的平方=36,它们的平均值4的平方=16,更接近12,
* 即 y/x 和 x 的平均值会更接近结果 根号y即x (y/x = x)
*
* */
private static int newton(int y) {
if(y == 0){
return 0;
}
return (int) sqrt(y, y); //第一个数是什么没有关系,正整数就可以,影响的是递归次数,会不断的找均值最终趋向x
}
//
public static double sqrt(double x, int y) {
double res = (x + y / x) / 2;
if (res == x) {
return x; //直到找到确切的根号y,即x
} else {
return sqrt(res, y); //不停找均值
}
}
}
网友评论