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课)

用二分法定义平方根函数(Bisection method Square Root Python)的更多相关文章

  1. 用牛顿-拉弗森法定义平方根函数(Newton-Raphson method Square Root Python)

    牛顿法(Newton’s method)又称为牛顿-拉弗森法(Newton-Raphson method),是一种近似求解实数方程式的方法.(注:Joseph Raphson在1690年出版的< ...

  2. CodeChef - SQRGOOD:Simplify the Square Root (求第N个含平方因子数)

    Tiny Wong the chef used to be a mathematics teacher in a senior high school. At that time, he always ...

  3. Codeforces 715A. Plus and Square Root[数学构造]

    A. Plus and Square Root time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  4. Project Euler 80:Square root digital expansion 平方根数字展开

    Square root digital expansion It is well known that if the square root of a natural number is not an ...

  5. Codeforces 612E - Square Root of Permutation

    E. Square Root of Permutation A permutation of length n is an array containing each integer from 1 t ...

  6. Plus and Square Root

    ZS the Coder is playing a game. There is a number displayed on the screen and there are two buttons, ...

  7. Codeforces 715A & 716C Plus and Square Root【数学规律】 (Codeforces Round #372 (Div. 2))

    C. Plus and Square Root time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  8. (Problem 57)Square root convergents

    It is possible to show that the square root of two can be expressed as an infinite continued fractio ...

  9. Square Root

    Square RootWhen the square root functional configuration is selected, a simplified CORDIC algorithm ...

随机推荐

  1. H5 34-背景图片

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 整数划分 poj3181

    分析 因为n,m分别最大1000,100 所以结果会超过ll,要用两个来存大数的两部分 代码 #include<iostream> #include<algorithm> #i ...

  3. c++入门之浅拷贝和深拷贝

    关于这方面的知识:见一篇精辟博文:https://blog.csdn.net/feitianxuxue/article/details/9275979

  4. centos7 安装phpmyadmin

    1.先安装epel,不然安装pgpmyadmin时会出现找不到包. yum install epel-release rpm -ivh http://rpms.famillecollet.com/en ...

  5. Python_字符串初识及操作

    字符串初识及操作 str  'alex'.'1235443543'.'[1,2,3]'.可存放少量数据. 索引.切片.步长 索引编号 正向索引 'python' 012345 'p'的正向索引编号为0 ...

  6. 05Hadoop 概论

    Hadoop的思想之源:Google Google搜索引擎,Gmail,安卓,AppspotGoogle Maps,Google earth,Google 学术,Google翻译,Google+,下一 ...

  7. Servlet 转发请求与重定向,以及路径问题

    转发请求 当一个servlet接收到请求后,如果需要将请求转发给另外一个servlet或者jsp文件,可使用下面这种方法: package cn.ganlixin.servlet; import ja ...

  8. UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-25: ordinal not in range(128)

    python报错:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-25: ordinal not in ...

  9. HTML,CSS笔记

    text-indent 属性规定文本块中首行文本的缩进.允许使用负值.如果使用负值,那么首行会被缩进到左边.p{ text-indent:50px; } HTML <label> 标签的 ...

  10. html js 表单提交前检测数据

    通过使用form的onsibmit来控制是否提交数据 返回值为真是提交,其他不变,示例如下: JS部分 function check() { var newPwd = document.getElem ...