2016-10-19 22 views
1

我嘗試寫認定使用丁型和戊立方根的程序,但我卡住了,因爲我無法弄清楚,爲什麼我的程序在一個無限循環運行的立方根發現使用丁型和戊在Python

num = 100 

    epsilon = 0.01 
    guess = num/3.0 


    while abs(guess**3 - num) >= epsilon: 
     delta = abs(guess**3 - num)/100 
     if guess**3 > num: 
      guess = (guess - delta) 
     if guess**3 < num: 
      guess = (guess + delta) 
    print("Guess:", guess) 
+0

我的猜測是,你的'猜測** 3 - num'不會收斂在這不到'epsilon' –

+0

我投票關閉這一問題作爲題外話值,因爲這問題的根源是一個不正確的數學算法。 –

+0

你的猜測越準確,你的增量變得越來越小,並且會繼續增加/減少越來越低的值 – Stumpp

回答

2

首先,您應該使用if/elif而不是單獨的if塊。

考慮以下幾點: 時guess**3 > numTrue,您可以通過降低其值更新guess使guess**3 < num(接下來如果條件)再次成爲True,可逆轉的初始更新。總之,guess的值在該循環中永遠不會改變,並且循環旋轉至無窮大。

其次,你想調整delta值(懲罰它),因爲它可能會隨着num的值增加而驚人地增大。

num = 100 

epsilon = 0.01 
guess = num/3.0 

while abs(guess**3 - num) >= epsilon: 
    delta = abs(guess**3 - num)/num 
    if guess**3 > num: 
     guess = (guess - delta*epsilon**0.5) 
    elif guess**3 < num: 
     guess = (guess + delta*epsilon**0.5) 
print("Guess:", guess) 
+0

是的,不要忘記'平等'分支:'guess ** 3> = num' –

+0

@EugenKonkov好觀察,但平等並不需要對「猜測」進行更新。當條件在下一次迭代中被評估時,相等將簡單地停止while循環。 –