基础算法六:求平方根的问题

求解\sqrt{n},也是面试中经常问的一个问题。该问题有两种解法:二分法和牛顿法。

首先说二分法,首先给定个初始区间范围[0,n],因为\sqrt{n}一定是在这个范围内,然后比较这个区间的中值的平方m^{2}和n,如果m^{2}小于n,将范围缩小为[m,n],如果m^{2}大于n,将范围缩小为[0,m​​​​​​​]。然后重复这个步骤,直到误差小于设定的阈值。

代码如下:

def binary_search(n, e=1e-5):
    '''
    二分法计算平方根
    '''
    max = n
    min = 0.
    mid = (max + min) / 2.
    while abs(mid * mid - n) > e:
        if mid * mid > n:
            max = mid
        elif mid * mid < n:
            min = mid
        else:
            return mid
        mid = (max + min) / 2.
    return mid

然后是牛顿法,牛顿法是一种求函数f(x)的0点的方法,对于我们这个问题,如果我们要求的值为x,那么x^{2}-n=0,于是就转化成了求f(x)=x^{2}-n的0点。牛顿法的做法是给定x的初始值x=x_{0},对f(x)求导求出f(x)x_{0}处的切线,该切线和y轴交点处为x_{1},将x更新为x_{1},重复刚才的过程,使x不断逼近f(x)=0的点。

如下图所示:

x的更新公式推导过程为:

f(x)x_{t-1}处的切线方程为:y=f'(x_{t-1})x+f(x_{t-1})-f'(x_{t-1})x_{t-1}

f'(x_{t-1})x_{t}+f(x_{t-1})-f'(x_{t-1})x_{t-1}=0

于是x_{t}=x_{t-1}-\frac{f(x_{t-1})}{f'(x_{t-1})}=x_{t-1}-\frac{x_{t-1}^{2}-n}{2x_{t-1}}=\frac{1}{2}(x_{t-1}+\frac{n}{x_{t-1}})

代码如下:

def newton_search(n, e=1e-5):
    '''
    牛顿法计算平方根
    '''
    x = n
    while abs(x * x - n) > e:
        x = (x + n / x) / 2.
    return x

运行结果如下所示:

if __name__ == '__main__':
    print(binary_search(2))
    print(newton_search(2))


1.414215087890625
1.4142156862745097

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值