zoukankan      html  css  js  c++  java
  • 用二分法定义平方根函数(Bisection method Square Root Python)

    Python里面有内置(Built-in)的平方根函数:sqrt(),可以方便计算正数的平方根。那么,如果要自己定义一个sqrt函数,该怎么解决呢?

    解决思路:

     1. 大于等于1的正数n的方根,范围肯定在0~n之间;小于1的正数n的方根,范围肯定在0~1之间

     2. 用二分法(Bisection method, Binary search)从中间开始找n的方根。

     3. 对于大于等于1的正数n,先假设n/2是n的方根,如果n/2的平方大于n,那么说明n的方根在0~n/2之间;如果n/2的平方小于n,说明n的方根在n/2~n之间。以此类推。。

     4. 对于小于1的正数n,先假设0.5是n的方根,方法同上

    这样做的好处是,每次都可以去掉一半可能的值。因此,搜索的范围越来越小。

    I------------------------I-------------------------I

    0                          n/2                            n

    举例来说,如果是求8的平方根,那么先假设8的平方根是4;

    4的平方是16,16大于8,因此8的平方根范围缩小到0~4之间;

    继续假设8的平方根是2,2的平方是4,4小于8,因此8的平方根范围缩小到2~4之间;

    继续假设8的平方根是3,3的平方是9,9大于8,因此8的平方根范围缩小到2~3之间;

    以此类推。。。

    代码如下:

    def sqrt_bi(n):
        '''为了方便起见,先假设n为正数'''
        low=0   #设置下限为0
        high=max(n,1)   #设置上限为n和1之中的最大数,即:如果n>=1,那么上限为n;如果n<1,那么上限为1
        guess=(low+high)/2   #先从中间值开始猜
        count=1   #设置猜测次数起始值为1
        while abs(guess**2-n)>0.00000000000000000001 and count<100: #当猜测值的平方和n本身的差值无限接近误差值时,循环才会停止;同时设置猜测次数不超过100次
            if guess**2<n:  #如果猜测值的平方小于n,那么将此设为下限
                low=guess
            else:           #如果猜测值的平方大于n,那么将此设为上限
                high=guess
            guess=(low+high)/2  #根据新的上下限,重新进行猜测
            count+=1    #猜测次数每次增加1
        return guess
    * 这里,我将0.00000000000000000001设为epsilon(误差值,epsilon为接近0值的浮点数)。epsilon越接近0,算出的方根值就越精确。

    调用此函数试一下,同时与python自带的sqrt函数进行对比:

    print(sqrt_bi(8))
    import math
    print(math.sqrt(8))

    运行结果如下:

    2.82842712474619
    2.8284271247461903

    python自带的sqrt函数比sqrt_bi函数还要更精确一些。

    参考:麻省理工学院公开课:计算机科学及编程导论 (第5课)

  • 相关阅读:
    python——socket,IO多路复用(select),socket server实现多并发
    python——多线程,多进程,协程
    python——装饰器,迭代器,生成器
    time模块,datetime模块
    re模块,paramiko模块
    Freemaker中使用中括号来包含标签
    Freemaker中使用中括号来包含标签
    freemarker Velocity获取request,session
    freemarker Velocity获取request,session
    freemarker Velocity获取request,session
  • 原文地址:https://www.cnblogs.com/HuZihu/p/7595922.html
Copyright © 2011-2022 走看看