平方根计算的逻辑思维

时间:2013-07-17 00:36:18

标签: python python-3.3 square-root

嘿,伙计们,所以我一直试图在最后一小时解读这个问题并在这里遇到一些麻烦。这是问题

  

这种计算数字n的平方根的方法从   在平方根上做(非零)猜测。然后使用   原始猜测根​​据公式计算一个新的猜测

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

有两个变量oldGuessnewGuess。将oldGuess初始化为   n / 2.0根据上述公式计算newGuess。使用   一个while循环迭代只要绝对值   oldGuessnewGuess之间的差异大于   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已经嵌入的函数,所以它必须手动完成我相信仍然会丢失猜测函数的含义。

3 个答案:

答案 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 newGuesswhile的值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但是不能真正地遵循你的代码。 (对此我很抱歉,抱歉)