4

在过去的一个小时里,我一直在尝试破解这个问题,但在这里遇到了一些麻烦。这就是问题

这种计算数字 n 平方根的方法首先是对平方根进行(非零)猜测。然后它使用原始猜测来计算新的猜测,根据公式

newGuess = ((n / oldGuess) + oldGuess) / 2.0;

有两个变量oldGuessnewGuess。根据上述公式初始化oldGuessn / 2.0计算。newGuess只要 和 之差的绝对值大于 oldGuess,就使用 while 循环进行迭代。不要忘记将 的值重置为while 循环中的 值。newGuess1.0E-06oldGuessnewGuess

在您的程序中,您将提示用户输入一个正数。如果该数字为负数,则打印一条错误消息并要求用户重试。对于正数,使用上述方法计算平方根。找出您获得的平方根与使用幂运算符获得的值之间的差。写出用户输入的值、您计算的平方根和差值(您的平方根 - 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的平方根。我什至不认为我的 while 语句在这种情况下是正确的。我不使用已经嵌入到 python 中的 squareroot 函数,所以它必须手动完成我相信仍然迷失了guess 函数的含义。

4

3 回答 3

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))
于 2013-07-17T00:51:08.783 回答
0

将那些eval()s 更改为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值。你会看到它正在改变它们,直到你得到你的答案。oldGuessnewGuesswhile

编辑

我注意到您似乎对为什么必须这样做感到困惑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 = cb == a则变为 false,因为b不再具有相同的值aa也不会改变,因为b被分配了它的值,而不是相反。想想=运算符看起来像<-(我认为某些语言实际上使用它作为赋值运算符)。

为什么这很重要?好吧,你确实为变量分配了一些新的东西,你忘记了旧的值。除非您有另一个变量存储相同的值,否则它会永远丢失。您的作业说要更新oldGuess到以前的newGuess. 换句话说,如果您的猜测是“a”、“b”、“c”、“d”,那么您将从oldGuess“a”开始,然后计算newGuess为“b”。因为这显然不是正确的猜测,所以你说oldGuess现在是newGuess刚才的 - “b”,然后你计算下一个newGuess,即“c”。

您需要 的值oldGuess来计算 的值newGuess。但是,您需要newGuess(在更改之前)的值来更新oldGuess. 这是一个 catch-22,除非您存储之前的值,newGuess如我上面所示(作为交换示例)。这就是你需要这个的原因。

于 2013-07-17T01:01:17.797 回答
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 但不能真正遵循您的代码。(新手,抱歉)

于 2013-07-17T02:10:43.850 回答