在过去的一个小时里,我一直在试图破译这个问题,但在这里遇到了一些麻烦。这就是问题所在
这种计算数字n的平方根的方法首先是在平方根处进行(非零)猜测。然后,根据公式,使用原始猜测来计算新的猜测。 newGuess = ((n / oldGuess) + oldGuess) / 2.0; 有两个变量
oldGuess和newGuess。将oldGuess初始化为n / 2.0,并根据上述公式计算newGuess。只要oldGuess和newGuess之间的差值的绝对值大于1.0E-06,就可以使用while循环来迭代。不要忘记在while循环中将oldGuess的值重置为newGuess值。 在您的程序中,您将提示用户输入一个正数。如果数字为负数,则打印错误消息并请用户重试。对于正数,使用上述方法计算平方根。找出你得到的平方根和使用指数运算符得到的值之间的差异。写出用户输入的值、计算的平方根和差值(平方根-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的平方根,我甚至不认为我的then语句在这个上下文中是正确的。我不使用内置到python中的已经嵌入的函数,所以它必须手动完成,我认为它仍然不知道猜测函数的含义。
发布于 2013-07-17 00:51:08
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))发布于 2013-07-17 01:01:17
将这些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的值。在你得到答案之前,你会发现它们在改变。
编辑
我注意到,您似乎对为什么要做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变为false,因为b不再具有与a相同的值。a也不会改变,因为b被分配了它的值,而不是相反。假设=操作符看起来像<- (我认为有些语言实际上使用它作为赋值运算符)。
这有什么关系?好吧,如果你给一个变量分配了一些新的东西,你就会忘记旧的值。除非您有另一个变量存储相同的值,否则它将永远丢失。您的任务是将oldGuess更新为以前的newGuess。换句话说,如果您的猜测是"a“、"b”、"c“、"d",那么您将以oldGuess作为"a”开始,然后将newGuess计算为"b“。因为这显然不是正确的猜测,所以您说oldGuess现在是newGuess刚才的- "b",然后计算下一个newGuess,即"c“。
您需要oldGuess的值来计算newGuess的值。但是,您需要newGuess的值(在更改它之前)来更新oldGuess的值。这是一个捕获-22,除非您存储前面的newGuess值,如我前面所示(作为交换示例)。所以你才需要这个。
发布于 2013-07-17 02:10:43
所以我想好了谢谢大家的帮助。我不知道我们不能在这里张贴家庭作业问题,但我正在努力学习如何编码,这样我就能更好地处理它。这是我的最后解决办法。
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,但是不能很好地遵循您的代码。(新来的,对不起)
https://stackoverflow.com/questions/17689229
复制相似问题