我正在尝试编写一个程序,使用delta和epsilon查找立方根但是我被卡住了因为我无法弄清楚为什么我的程序在无限循环中运行
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)I am trying to write a program that finds cubed root using delta and epsilon but i'm stuck because i cant figure out why my program runs in an infinite loop
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)最满意答案
首先,你应该使用if/elif而不是单独的if块。
请考虑以下情况:当guess**3 > num为True ,通过减小其值来更新guess ,以便guess**3 < num (下一个if条件)再次变为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)First thing, you should use if/elif instead of separate if blocks.
Consider the following: when guess**3 > num is True, you update guess by reducing its value so that guess**3 < num (the next if condition) becomes True again, which reverses the initial update. In summary, the value of guess is never changed in that loop, and the loop whirls to infinity.
Secondly you want to regularize the delta value (penalize it) as it can be come alarming large as the value of num increases.
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)更多推荐
发布评论