def findRoot1(x, power, epsilon):
low = 0
high = x
ans = (high+low)/2.0
while abs(ans**power - x) > epsilon:
if ans**power < x:
low = ans
else:
high = ans
ans = (high+low)/2.0
return ans
def findRoot2(x, power, epsilon):
if x < 0 and power % 2 == 0:
return None
#can't find even powered root of negative number
low = min(0, x)
high = max(0, x)
ans = (high+low)/2.0
while abs(ans**power-x) > epsilon:
if ans**power < x :
low = ans
else:
high = ans
ans = (high+low)/2.0
return ans
def findRoot3(x, power, epsilon):
"""x and epsilon int or float, power an int
epsilon > 0 and power >= 1
returns a float y s.t. y**power is within epsilon of x.
if such a float does not exist, it returns None."""
if x < 0 and power % 2 == 0:
return None
#can't find even powered root of negative number
low = min(-1, x)
high = max(1, x)
ans = (high+low)/2.0
while abs(ans**power-x) > epsilon:
if ans**power < x :
low = ans
else:
high = ans
ans = (high+low)/2.0
return ans
为什么findRoot1(-27.0,3,0.001)在第一种情况下失败?逻辑是如何形成的?
为什么findRoot2(0.25,3,20.00)在第二种情况下失败? findRoot2(-27.0,3,0.001)如何通过这里?
它适用于第三种情况。怎么样?
答案 0 :(得分:1)
案件中的问题是 -
第一种情况:您假设您获得的输入x
始终为正,因为您始终将其设置为高,因此在发送负数时,第一次迭代中的ans
为-13.5,并且由于(-13.5)**3
为负,因此它总是小于epsilon,因此您将-13.5设置为low
并从那里开始不断减少(转到 - 在下一次迭代中为20.25)直到达到-27(即低和高都变为-27)然后进入无限循环。
第二种情况:您没有处理数字小于1的情况,在这种情况下,该数字的功率会更小,例如x = 0.125
,x^3 = 0.001953125
。但是,第二种情况的逻辑取决于ans**power
总是大于x
,这只有在x
本身大于1时才有效。再次,这会导致low
在第一次迭代后设置为0.125
,然后它继续增加,直到low
等于high
= 0.25
,在这种情况下它会进入无限循环。
第三种情况:它有效,因为您更改了设置low
和high
的条件,使ans
不小于1且它也处理负数。