这种计算数字n的平方根的方法从 在平方根上做(非零)猜测。然后使用 原始猜测根据公式计算一个新的猜测
newGuess = ((n / oldGuess) + oldGuess) / 2.0;
有两个变量
中的oldGuess
和newGuess
。将oldGuess
初始化为n / 2.0
根据上述公式计算newGuess
。使用 一个while循环迭代只要绝对值oldGuess
和newGuess
之间的差异大于1.0E-06
。不要忘记将oldGuess
的值重置为newGuess
值。{/ p>在您的程序中,您将提示用户输入正数。 如果数字为负数,则打印错误消息并要求用户 再试一次。对于正数,使用计算平方根 以上方法。找出您获得的平方根之间的差异 和使用指数运算符得到的值。写 输出用户输入的值,计算出的平方根,以及 差异(你的平方根 -
n ** 0.5
)
到目前为止这是我的程序
def main():
n = eval(input("Enter a positive number: "))
while (n <= 0):
print ("Error please re-input")
n = eval(input("Enter a positive number: "))
oldGuess = n / 2.0
newGuess = ((n / oldGuess) + oldGuess) / 2.0;
difference = n - n ** 0.5
while (difference < 1 * 10 ** -6):
print ("Error")
difference = abs(n - n ** 0.5)
print ("Difference:", difference)
main()
所以我真的不明白我们怎么能告诉程序做出猜测然后计算变量n的平方根。在这种情况下,我甚至认为我的时间陈述是正确的。我没有使用python内置的squareroot已经嵌入的函数,所以它必须手动完成我相信仍然会丢失猜测函数的含义。
答案 0 :(得分:1)
while True:
n = float(input("Enter a positive number: "))
if n > 0:
break
print ("Error please re-input")
oldGuess = n / 2.0
while True:
newGuess = ((n / oldGuess) + oldGuess) / 2.0;
oldGuess = newGuess
if -1e-6 < n - newGuess * newGuess < 1e-6:
break
print ("Difference:", abs(n ** .5 - newGuess))
答案 1 :(得分:0)
将eval()
更改为float()
s。 eval()
执行它所交给的任何代码,这意味着您的用户可以在那里键入恶意内容。
现在,将其用于第二部分:
oldGuess = n / 2.0
newGuess = ((n / oldGuess) + oldGuess) / 2.0
while (abs(oldGuess - newGuess) > 1e-06):
oldGuess, newGuess = newGuess, ((n / oldGuess) + oldGuess) / 2.0
print("Guess: " + str(n))
print("My root: " + str(newGuess))
print("Accuracy: " + str(newGuess - (n**0.5)))
这个逗号语法是一个Python惯用语,可用于交换值而无需执行:
temp = new
new = old * something
old = temp
当你的差值小于 而非(非常小)值时,你对while循环的条件是寻找结束循环。因此,只要更大,就会循环。
注意:您也可以使用math.sqrt(n)
代替n ** 0.5
。你必须import math
。
如果您想查看自己的计划内容,请在print
循环中oldGuess
newGuess
和while
的值oldGuess = newGuess
。在你得到答案之前,你会看到它正在改变它们。
修改强>:
我注意到你似乎被绊倒了为什么你必须做=
。让我解释一下:=
运算符与数学中的等号不同。等号表示左边的东西和右边的东西是一样的;即它们等同于。在Python中,==
运算符表示“给左边的东西赋予与右边的东西相同的值”。它被称为赋值运算符。您正在考虑>>> a = 10
>>> b = 4
>>> b = a
>>> b
10
>>> a == b
True
>>> c = 6
>>> b = c
>>> b
6
>>> a == b
False
>>> b == c
True
>>> a == c
False
>>> a,b,c
(10, 6, 6)
运算符,它测试等效性(基本上)。
=
正如您所看到的,当您使用b = a
运算符时,您不会将变量“链接”在一起,并说它们现在是相同的。如果您设置b = c
然后设置b == a
,则b
会变为false,因为a
不再具有与a
相同的值。 b
也不会更改,因为=
已分配了其值,而不是相反。可以考虑<-
运算符,而不是oldGuess
(我认为某些语言实际上使用它作为赋值运算符)。
为什么这很重要?嗯,你确实给变量分配了一些东西,你忘记了旧值。除非你有另一个存储相同值的变量,否则它将永远丢失。您的作业是将newGuess
更新为之前的oldGuess
。换句话说,如果您的猜测是“a”,“b”,“c”,“d”,那么您将从newGuess
开始为“a”,并从那里将oldGuess
计算为“ b”。由于这显然不是正确的猜测,你说newGuess
现在是newGuess
刚刚 - “b”,你计算下一个oldGuess
,即“c”
您需要newGuess
的值来计算newGuess
的值。但是,您需要oldGuess
的值(在更改之前)以更新newGuess
的值。它是一个catch-22,除非你存储我之前显示的{{1}}之前的值(作为交换示例)。这就是你需要这个的原因。
答案 2 :(得分:0)
所以我想出来感谢大家的帮助。我不知道我们不能在这里发布作业问题,但我正在努力学习如何编码以便我可以更好地学习它。这是我的最终解决方案。
def main():
n = float(input("Enter a positive number: "))
while (n <= 0):
print ("Error please re-input")
n = eval(input("Enter a positive number: "))
oldGuess = n / 2.0
newGuess = 0
difference = 10
while (difference >= 1 * 10 ** -6):
newGuess = ((n / oldGuess) + oldGuess) / 2.0
difference = abs(newGuess - oldGuess)
oldGuess = newGuess
print ("Square Root is: ", newGuess)
differenceSqrt = newGuess - n ** 0.5
print ("Difference is: ", differenceSqrt)
main()
我仍然不知道如何有效地使用中断,所以感谢gnibbler但是不能真正地遵循你的代码。 (对此我很抱歉,抱歉)