2016-09-20 58 views
0

我已经做了一个简单的函数称为“约”,它将两个数字相乘,然后将它们除以二。当我单独使用函数时,它的效果很好,但它似乎代码丰富,我没有把它分成两半,我不知道为什么。这是我的代码错误在哪里,我该如何解决?数字拒绝划分

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 
+4

是什么让你觉得师没有发生? – user2357112

+0

如果'Approx(root,trunk)> oroot - 模糊和Approx(root,trunk)(oroot - 模糊)和(Approx(root,干线) albert

+0

'Approx'的期望输出是什么?回想一下Python 3中'5 // 2'('5 // 2 = 2')和'5/2'('5/2 = 2.5')的区别。而在Python 2中则相反。 – albert

回答

1

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

1

您的函数按照您描述的方式工作,但是我不明白您如何在代码的其余部分使用它。

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

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

有多种方式来提高你的代码的其他方面:

  • 我建议不要使用哨兵值循环的突破,break语句更加明确。
  • 您可以直接使一个循环具有最大步骤数,有:

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

    如果break达成的else块才会被调用。