2017-10-04 60 views
-4

我不知道爲什麼我有下面的代碼無限循環。謝謝你告訴我,並回答!無限循環在適當的解決方案

cube = 25 
epision = 0.01 
guess = 0 
increment = 0.01 
while abs(guess**3 - cube) >= epision: 
    guess += increment 
if abs(guess**3 - cube) >= epision: 
    print("Failed on cube root of", cube) 
else: 
    print (guess, 'is close to the cube root of',cube) 
+1

「if」永遠不會是真的,因爲循環會重複,如果是的話。 – Barmar

+0

爲什麼你會期望循環結束? – user2357112

+1

考慮'猜** 3 - 立方體'。猜測從0開始,所以它是-25。然後它變成1,它是-24。然後它變成2,它是-17。然後它變成3,它是2.從那時起,差異總是正面的,而且每次迭代都會變得更大。問題是,加1猜測開始將它從期望值進一步移動而不是更接近。這不是一個真正的Python問題,這是一個算法問題。 –

回答

2

的問題是,即使是在它最接近的,guess**3cube之差的絕對值仍然0.10291200000046885,因此比epsilon大。

爲了解決這個問題,你可以:

  • 使用較大epsilon或更小increment
  • 或一旦明星再次上升
  • 比較的絕對差在最後一次迭代和break的區別或者只是檢查guess**3 > cube,因爲無論如何你都在測試0而不是二進制搜索

或實際上使用binary search;這是一個更好的算法,收斂速度更快的目標,併爲(幾乎)任意小的ε,並沒有那麼難實現:

lower, upper = 0, cube # cube root has to be between these two numbers 
while abs(guess**3 - cube) >= epision: 
    if guess**3 > cube: 
     guess, upper = (guess + lower)/2, guess 
    else: 
     guess, lower = (guess + upper)/2, guess 
0

25立方根約爲2.92402

guess = 2.92guess ** 3 = 24.897,所以abs(guess ** 3 - cube) == 0.103,它不小於epsilon。所以你加0.01guess

guess = 2.93,guess ** 3 = 25.154,所以abs(guess ** 3 - cube) = 0.154,這也是不少於epsilon

隨着您不斷添加0.01guess,您將會走得更遠,因此循環會無限延續。