利用二分查找求实数立方根(python)

二分查找的概念与条件

1.概念:

例:在1~100中找到33

 相较于穷举法一般搜索步长不变,二分法每次迭代搜索步长均减半

新的猜想值取搜索范围的中间值

从而是搜索速度加快,时间复杂度为log2N(在大数据下优势明显)

2.条件

保证单调性且无重复元素

立方根求解(包括对负数,正数,大于小于1的小数,0的情况分析)

1.最一般情况,即大于1的正数求其立方根

cube = 27#以27为例
epsilon = 0.01
low = 0
high = cube
guess = (high + low)/2.0
while abs(guess**3 -cube) >= epsilon:
    if guess**3 < cube :
        low = guess
    else:
        high = guess
    guess = (high + low)/2.0
print(guess, '是', cube, '立方根的近似解')

2.为负数

类比正数,与正数的差距只有一个符号

if cube>0:
    print(guess,'是',cube,'立方根的近似解')
if cube<0:
    print('-',guess,'是',cube,'立方根的近似解')

3.在0到1之间

修改上下界,在(cube,1)之间二分

low = abs(cube)
high = 1.0
guess = (high+low)/2.0

(此处仅给出在完整代码上的修改片段)

cube = float (input('请输入一个数:'))
epsilon = 0.0001
low = 1.0     
high = abs(cube)
guess = (high+low)/2.0
if cube==0.0:
    print(guess,'是',cube,'立方根的近似解')
if abs(cube)<1 and abs(cube)>0:
    low = abs(cube)
    high = 1.0
    guess = (high+low)/2.0
    while abs(guess**3-abs(cube))>=epsilon:
        if guess**3<abs(cube):
            low = guess
        else :
            high = guess
        guess=(high+low)/2.0
    if cube>0:
        print(guess,'是',cube,'立方根的近似解')
    if cube<0:
        print('-',guess,'是',cube,'立方根的近似解')
else:
    while abs(guess**3-abs(cube))>=epsilon:
        if guess**3<abs(cube):
            low = guess
        else :
            high = guess
        guess=(high+low)/2.0
    if cube>0:
        print(guess,'是',cube,'立方根的近似解')
    if cube<0:
        print('-',guess,'是',cube,'立方根的近似解')

附录:

epsilon的精度问题

1.小数点后几位到底是如何确定的:与epsilon有关,即与步长有关,epsilon越小约精确,但耗时越长

2.为什么修改epsilon的值后求值的小数位不变:不仅与epsilon有关,还与二分次数有关

如何让代码更优美——调用函数!

def cube_root(cube,epsilon):
    low = min(1.0,abs(cube)) #注意此处设置,大于1时不再从0.0开始二分,是为简化代码   
    high = max(1.0,abs(cube))
    guess = (high+low)/2.0
    if cube==0.0:
        print(cube,'是',cube,'立方根的近似解')
    while abs(guess**3-abs(cube))>=epsilon:
        if guess**3<abs(cube):
            low = guess
        else :
            high = guess
        guess=(high+low)/2.0
    if cube>0:
        print(guess,'是',cube,'立方根的近似解')
    if cube<0:
        print('-',guess,'是',cube,'立方根的近似解')
    return guess

cube = float (input('请输入一个数:'))
epsilon = float (input('请输入一个数:'))
guess = cube_root(cube,epsilon)

(如有出错,欢迎指正!)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值