2017-10-04 57 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,您将会走得更远,因此循环会无限延续。