这三段代码是如何进行逻辑推理的?
How is the logic reasoning done in these three codes?
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, 0.001) 在第二种情况下会失败? findRoot2(-27.0, 3, 0.001) 是怎么传到这里的?
它适用于第三种情况。怎么样?
案例中的问题是-
第一种情况:你假设你得到的输入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,它也处理负数。
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, 0.001) 在第二种情况下会失败? findRoot2(-27.0, 3, 0.001) 是怎么传到这里的?
它适用于第三种情况。怎么样?
案例中的问题是-
第一种情况:你假设你得到的输入
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,它也处理负数。