求解平方根3种方法:
- 二分法
- 递归+位操作法
- 牛顿迭代法
介绍第二种递归操作方法:
本方法的思路是使用递归,每一步都减小 xx,直到 x < 2x<2。当 x < 2x<2 时有 有 sqrt(x)=x无需减小。当 x >= 2x>=2 时,减小方法如下:
mySqrt(x)=2*mySqrt(x/4)
减小 xx 可以用左移或右移实现,因为这种方式计算效率非常高。
x<<y表示x*pow(2,y)x >> y表示 x/pow(2,y)
因此递归式子可以写作:
mySqrt(x)=mySqrt(x>>2)<<1
代码如下:
class Solution {
public int mySqrt(int x) {
if (x < 2) return x;
int left = mySqrt(x >> 2) << 1;
int right = left + 1;
return (long)right * right > x ? left : right;
}
}