2016-09-20 55 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塊纔會被調用。