一种经典的求解思路就是使用二分法。
可以使用二分法的原因是y=x^2是单调递增的
二分法
递归版本
function sqrt(n){
return _sqrt(0,n)
function _sqrt(left,right){
if(Math.abs((left-right))<1e-9){
return left
}
let mid = (left+right)/2
let y = mid * mid
if(y>n){
return _sqrt(left,mid)
}else if(y==n){
return mid
}else{
return _sqrt(mid,right)
}
}
}
迭代版本
function sqrt(n){
if(n===0 || n===1){
return n;
}
let left = 0;
let right = n;
let mid;
let y;
while(Math.abs((right-left))>1e-9){
mid = (left+right)/2;
y = mid * mid;
if(y>n){
right = mid;
}else if(y===n){
return mid
}else{
left = mid;
}
}
return left
}
牛顿迭代法
function sqrt(n){
let x = n;
while(x * x >n)
x = (x+n/x)/2
return x
}