号码拒绝分裂

时间:2016-09-20 03:04:43

标签: python python-3.x

我做了一个名为"大约"它将两个数字相乘,然后将它们除以2。当我单独使用该功能时,它工作得很好,但似乎在代码的大块中我没有将数字分成两半,我不知道为什么。这是我的代码,错误在哪里,我该如何解决?

import math

def Approx(low,high):
    base = low * high
    return base/2

root = float(input("What to approx the sqrt of : "))
vague = float(input("How off can it be? : "))
wrong = True
oroot = root
root = math.floor(float(root))
trunk = root + 1
step = 0
while wrong:
    if Approx(root,trunk) > oroot - vague and Approx(root,trunk) < oroot:
        print("Done. " + str(step) + " steps taken.")
    else:
        if Approx(root,trunk) > oroot:
            temproot = root
            root = Approx(root,trunk)
            trunk = temproot
            step += 1
            print("Step " + str(step) + " finished. Approx is " + str(Approx(root,trunk)))
        else:
            temptrunk = trunk
            trunk = Approx(root,trunk)
            root = trunk
            step += 1
            print("Step " + str(step) + " finished. Approx is " + str(Approx(root,trunk)))
    if step > 50:
        print("More than fifty steps required.")
        wrong = False

2 个答案:

答案 0 :(得分:1)

您的功能以您描述的方式工作,但我不明白您如何在其余代码中使用它。

您似乎正在尝试使用牛顿方法的变体来近似平方根,但很难理解您是如何实现它的。您的代码中的某些变量未被使用(temptrunk是什么?),并且很难确定它是有意还是错误。

如果确实是你想要实现的牛顿方法,你需要有一个收敛到目标值的近似函数。为此,您计算猜测的算术平均值和目标值除以此猜测(new_guess = mean([old_guess, target/old_guess]))。完成后,您只需要比较new_guesstarget之间的差异,一旦达到给定的阈值(在代码vague中),就可以打破循环

有多种方法可以改善代码的其他方面:

  • 我建议不要使用sentinel值来摆脱循环,break语句更明确。
  • 您可以直接使循环具有最大步数,使用:

    for step in range(MAX_STEPS):
        guess = ... # try to guess
        if abs(target - guess) < delta:
            break
    else:
        print("Maximum steps reached.")
    

    只有else

  • 时才会调用break块。

答案 1 :(得分:1)

在我看来,它绝对 除以2,只是除以2并不会将两个大数相乘。例如,假设您想要找到10的平方根。 trunk设置为11Approx(root, trunk)10 * 11 / 2 = 55。这设置为roottrunk变为旧root10。现在,您有5510而不是1011。重复几次,最后得到inf。更多地了解您尝试实施的方法(是巴比伦方法吗?)并查看您的程序和方法的不同之处。这可能是你的困境的根源,而不是缺乏分裂。