2013-07-17 55 views
4

嘿傢伙,所以我一直試圖破譯這個問題的最後一個小時,現在有一些麻煩。這是問題計算平方根的邏輯思維

這種計算數字n的平方根的方法開始於 在平方根處作出(非零)猜測。然後,它使用 原來的猜測來計算新的猜測,根據公式

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

有兩個變量oldGuessnewGuess。初始化oldGuessn/2.0並根據上述公式計算newGuess。只要oldGuessnewGuess之間的差值的絕對值大於 1.0E-06,則使用 a 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的平方根。我甚至不認爲我的言論在這方面是正確的。我不使用已經嵌入python的squareroot函數,所以它必須手動完成,我相信猜測函數意味着什麼。

+2

這是一個功課題嗎? – Kye

+0

您想要繼續迭代,而絕對差值*大於*小於,而不是小於。 – lurker

+0

使用'eval'是危險的。使用'float'代替 –

回答

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)) 
+3

爲他做OP的功課不會幫助他。 – user2357112

+0

@ user2357112,您應該將-1保存爲錯誤的答案。 SO課的作業政策非常明確。此外,當我發佈這個功能時,沒有提到作業。 –

+0

@gnibbler這很明顯,它是功課,但你是正確的。 – 2rs2ts

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

如果你想看看你的程序在做什麼,嘗試printwhile環路內荷蘭國際集團的oldGuessnewGuess值。你會看到它正在改變他們,直到你到達你的答案。

編輯

我注意到,你似乎在爲什麼你要做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,因爲ba的值不再相同。 a也不會改變,因爲b被賦值,而不是相反。想想=運營商看起來像<-而不是(我認爲一些語言實際上使用它作爲賦值運算符)。

這是爲什麼?那麼,你確實給變量賦了新的東西,你忘記了舊的值。除非你有另一個變量存儲相同的值,否則它會永遠丟失。您的任務說要將oldGuess更新爲之前的newGuess。換句話說,如果你的猜測是「a」,「b」,「c」,「d」,那麼你將從oldGuess開始爲「a」,並從那裏計算newGuess爲「b」。因爲這顯然不是正確的猜測,所以你說oldGuess現在是newGuess剛纔的 - 「b」,並且你計算下一個newGuess,它是「c」。

您需要值oldGuess來計算newGuess的值。但是,您需要newGuess(在更改之前)的值來更新oldGuess的值。這是一個catch-22,除非你像前面展示的那樣存儲之前的值newGuess(作爲交換示例)。這就是爲什麼你需要這個。

+0

非常感謝您的幫助。肯定需要澄清 –

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,但不能真正遵循你的代碼太好。 (新對此,對不起)

+0

只要你的問題不適合任何[這些類別](http://stackoverflow.com/help/dont-ask),我敢肯定你可以問作業。 (因此,讓你的問題不那麼具體到你的任務和更一般的,所以它會對其他人有用......例如,你可以題目這個問題「平方根計算循環的麻煩」或類似的東西。) – 2rs2ts