下面是我的代码,它似乎不适用于-1和0之间的数字(否则工作得很好)
我认为代码进入了一个无限循环,不知何故,因此我输入数字后没有结果。请看一下,让我知道应该做什么修改。我是一个初学者在编程,并将感谢任何帮助!
cube = float(input('Enter:'))
if abs(cube) > 1:
num_guesses = 0
epsilon = 0.0001
low = 0
high = cube
guess = (high + low) / 2.0
while abs(abs(guess) ** 3 - abs(cube)) >= epsilon:
if cube > 0:
if guess ** 3 < cube:
low = guess
else:
high = guess
guess = (low + high) / 2.0
num_guesses += 1
else:
if guess ** 3 > cube:
low = guess
else:
high = guess
guess = (low + high) / 2.0
num_guesses += 1
if abs(cube) < 1:
num_guesses = 0
epsilon = 0.0001
low = cube
high = 1
guess = (high + low) / 2.0
while abs(abs(guess) ** 3 - abs(cube)) >= epsilon:
if cube > 0:
if guess ** 3 < cube:
low = guess
else:
high = guess
guess = (low + high) / 2.0
num_guesses += 1
else:
low = -1
high = cube
if guess ** 3 > cube:
high = guess
else:
low = guess
guess = (low + high) / 2.0
num_guesses += 1
print(num_guesses)
print('The cube root of',cube,'is closest to',guess)
字符串
多谢了!
3条答案
按热度按时间8wigbo561#
Python_3实现使用二分法求立方根。
您可以创建函数来进一步简化它
字符串
对于0和1之间或0和-1之间的数字
型
对于大于1且小于-1的数字
型
使用二分法初始化猜测
型
声明误差幅度并计算近似猜测(二分法)
型
最终输出
型
vcirk6k62#
通过将条件更改为
字符串
事实上,你必须使用这个条件,而不是
型
因为后者可能会给予假肯定(并因此过早地退出while-loop)。例如,如果
guess
等于2且cube
等于-8,则后一个条件为True,即使2不是-8的立方根。型
注意,在你的代码中,有时
low
可以大于high
。例如,如果cube < 0
,那么low
和high
是这样初始化的:型
特别是因为我们是二等分的,如果我们可以依赖于
low
总是<= high
,这将是有帮助的。如果我们记录并遵守一个自我强加的编码契约,low <= high
,如果我们另外选择low
和high
,使得立方根总是在low
和high
之间,那么代码就变得简单多了:型
不再需要处理
abs(cube) > 1
,abs(cube) < 1
,cube > 0
或cube <=0
的情况。所有cube
的值都可以以相同的方式处理,因为guess**3 - cube
是guess
的单调递增函数。如果guess**3 > cube
,如果guess
太大,则减少guess
。如果guess**3 < cube
,guess
太小,则增加猜测。由于我们知道low <= high
,因此如何调整low
和high
的逻辑变得简单。顺便说一下,在你的原始代码中,
型
在最后一个
else
子句中的行是代码陷入无限循环的部分原因。low
和high
只应该初始化一次。将这些行放在while循环中会将low
和high
重置为一个宽的、简单的间隔,并丢弃之前的二分法迭代所做的工作。c7rzv4ha3#
下面是一个通过对分搜索求n次方根的脚本(修改自第4讲here)。
字符串
它返回x,使得abs(xr-瓦尔)<= 0。
例如findRoot(5,-0.734,10(-5))返回-0.9400253295898438。结果可以由其他计算器检查。
下面是一个单行编辑,它还打印了所涉及的间隔:
型
下面是findRoot(5,-0.734,10**(-5))的结果:
x1c 0d1x的数据