用二分法定义平方根函数(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课)
用二分法定义平方根函数(Bisection method Square Root Python)的更多相关文章
- 用牛顿-拉弗森法定义平方根函数(Newton-Raphson method Square Root Python)
牛顿法(Newton’s method)又称为牛顿-拉弗森法(Newton-Raphson method),是一种近似求解实数方程式的方法.(注:Joseph Raphson在1690年出版的< ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- Plus and Square Root
ZS the Coder is playing a game. There is a number displayed on the screen and there are two buttons, ...
- 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 ...
- (Problem 57)Square root convergents
It is possible to show that the square root of two can be expressed as an infinite continued fractio ...
- Square Root
Square RootWhen the square root functional configuration is selected, a simplified CORDIC algorithm ...
随机推荐
- c++构造函数成员初始化中赋值和初始化列表两种方式的区别
先总结下: 由于类成员初始化总在构造函数执行之前 1)从必要性: a. 成员是类或结构,且构造函数带参数:成员初始化时无法调用缺省(无参)构造函数 b. 成员是常量或引用:成员无法赋值,只能被初始化 ...
- IdentityServer4【Introduction】之包和项目构建
包和项目构建 IdentityServer包含了以下的nuget包: IdentityServer4 nuget | github 这个包包含了IdentityServer核心的组成部分,有对象模型, ...
- C#设计模式之8:外观模式
外观模式 外观模式和适配器模式一样,都实现了接口改变,适配器模式是让一个接口转化成另外一个接口,而外观模式是让接口变得更简单. 先来看一下需求: 外观模式没有封装子系统的类,外观只是提供一个统一的接口 ...
- 10 Comparisons with adjectvies and nouns
1 比较级用来比较两个词条之间的关系,比较级是通过在形容词后加 er 或者在形容词之前加 more 构成. 它的反义句是通过在形容词前加 less 或者 not as构成. Perfume sales ...
- [转帖] BMC安全隐患
BMC再现漏洞,裸金属云服务器岌岌可危 https://zhuanlan.kanxue.com/article-8006.htm 之前有vt-x 可能有隐患 现在看起来BMC 也就是IPMI 也有隐患 ...
- Day 5-8 自定义元类控制类的实例化行为
__call__方法: 对象后面加括号,触发执行. 注:构造方法的执行是由创建对象触发的,即:对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类( ...
- python爬虫之Phantomjs安装和使用
phantomjs: PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎.它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG. phantom ...
- Mysql如何快速插入100万条记录?
1.java程序拼接insert带多个value,使一次提交多个值. 2.插入数据之前先删除索引(注意主键不能删除),然后插入数据,最后重建索引 3.可以设置手动commit,用来提高效率 4.使用批 ...
- Django--CRM--菜单展示, 删除合并, 权限展示
一 . 菜单展示 二 . 合并删除 我们可以把所有的删除都合并成一个函数这样就会减少很多的代码. 思路: 在url里面需要传两个参数,一个是要删的id 一个是名字 三 .权限展示 我们要实现两个功能 ...
- 【纪录】Proxychain4 使用部署以及利用 ss 加速下载操作
我觉得这个方案用来解决 linux 机器上面 apt-get 和 yum 国外源拉去取过慢的问题还是还不错的. 参看下面两个教程. Reference: https://brickyang.githu ...