二分查找实现:
首先我们先把中点找出来,如果mid平方<=x那么就把L移动到mid位置上+1,因为mid的位置已经算过一次了,mid=L+(r-L)。
如果mid平方>=x那么就把r移动到mid位置上-1,还是mid=L+(r-L)。
private static int binarySeach(int x) {
int index=0,left=0,right=x,times1=0;
while (left<=right){
int mid=left+(right-left)/2;
if(mid*mid<=x){
index=mid;
left=mid+1;
}else {
right=mid-1;
}
}
return index;
}
如果有学过二分法思想,该方法还是很简单的。下面是重头戏牛顿递归。
牛顿递归实现:
首先我们不难发现=x,n=x/n,假设x=12,2*6=12,3*4=12,
*
=12。
通过因数之间的运算得知:(2+6)/2=4,=4,
平方=12,
=16。(因数+因数)/2的值更接近n,所以我们可以将(x/n+n)/2==n作为if判断条件,代码如下。
private static int newton(int x){
//给double n的值是无关紧要的,因为在多次递归的res赋值运算中会将res收敛n*n=x
return (int)sqrt(x,x);
}
public static double sqrt(double n,int x){
double res=(n+x/n)/2;
if(res==n){
return n;
}else{
return sqrt(res,x);
}
}
两种方法的计算速度如下图,牛顿递归明显更优于二分查找,所以更建议学习牛顿迭代。