2012-05-11 69 views
4

我試圖找到一系列的總和:1 − 1/2 + 1/3 − 1/4 + · · · + 1/99 − 1/100 ** 2與蟒蛇。總和給出一系列

我的代碼 -

psum = 0 
nsum = 0 
for k in range(1,100): 
    if k%2 == 0: 
     nsum += 1.0/k 
    else: 
     psum += 1.0/k 

print psum - nsum - 1.0/100**2 

輸出爲0.69807217931

我沒有答案,只是想驗證,如果我這樣做是正確的。

這不是一個家庭作業的問題,但只是隨機Python的做法。

+2

你確定你只是想打平最後一個詞嗎? (好吧,如果它不是家庭作業,那麼這取決於你我想:)) –

+1

是的,它只是最後一個術語,我是從一個隨機的PDF格式的問題,我從互聯網上獲得,它被稱爲「A Python中的數學短期課程「。 – Varun

回答

5

工作正常,但爲什麼不只是使用一個「求和」變量(稱爲total,因爲有一個內置的稱爲sum的內置實用程序,您不想隱藏),並且在每一步中實際添加或減去它?

交替(雙打!),實際上使用sum功能。 range函數也可以用來跳過每一個其他數字。

>>> sum(1.0/k for k in range(1, 100, 2)) - sum(1.0/k for k in range(2, 100, 2)) - (1.0/100**2) 
0.6980721793101952 

或者,作爲steveha所示,可以使用邏輯來梳理是否添加或減去基於它是否是被2整除的數目,並用「加權」總和(增加1.0/k或處理它-1.0/k)。這就是爲什麼你應該學習更多的數學作爲一個程序員:)

+0

我推薦給三元運算符的兩筆金額以+1單數表示。+1 – mgilson

+0

真的嗎?我真的不知道。雖然'sum(-1.0 **(k + 1)/ k ...)'是我習慣看到的更好的模型,實際上:)因爲數學家通常會這麼寫。然而,指數負數不能像Python那樣工作... –

+0

是的 - 只是我的偏好問題。如果python的三元運算符更類似C,我可能會認爲它,但實際上,我不喜歡在我的「數學」公式中看到「控制」語句。 – mgilson

3
sum(1.0/k if k % 2 else -1.0/k for k in xrange(1, 100)) - 1.0/100**2 

上面的代碼做同樣的事情,你的代碼,並得到了相同的答案。

爲什麼串聯使用從1 1/K至99,然後用1/K ** 2只是對於k == 100?

+0

我愛列表理解,但忘記使用它們,當我看到一個問題,也許我需要開始更多地使用它們:) – Varun

+0

這絕對是我通常會做的,但我認爲OP的數學技能不理解加權sum ... –

+1

在這種情況下,它是一個「生成器表達式」。列表理解建立一個列表,但是一個生成器表達式只是逐個產生值。您可以像使用listcomp一樣輕鬆地迭代genexp,並且效率更高,因爲Python不需要構建將被使用一次然後刪除的列表。 – steveha

1

,看看你這樣做是正確的是更短的系列,一個是你可以手工檢查嘗試一下最簡單的方法。例如,使用範圍(1,5)並查看它是否給出您期望的答案。

對於風格提示,你可以改用範圍的xrange。 xrange很好,因爲它只是根據需要返回每個數字,而範圍則創建了所有數字的大列表。如果你爲範圍(1,1000000)做了這個,它會佔用大量的內存,而xrange不會。

你也可以逃脫的總和,而不是兩個只是一個變量,我想。

+0

這是2.x特有的;在3.x中,'range'確實是'xrange'用來做的,並且沒有更多的'xrange'。 (爲了得到'範圍'用來做什麼,你可以將'list'應用到結果中。) –

3

好吧,我相信

import math 
print math.log(2) 

會做的伎倆。

+0

好找 - 除(1/100)** 2項外... – mgilson

+0

這就是求和的極限;這裏我們正在尋找特定數量的術語。 –

+0

@KarlKnechtel:OP想驗證他們的代碼是否正常工作,這是檢查的最短途徑。由於你的答案在頂部,我建議你編輯這個信息(WP鏈接:http://en.wikipedia.org/wiki/Logarithm#Power_series) – georg

0

這是我的建議。 小但更多LOC然後@steveha但更通用。

getx=lambda x:(1.0/x)*((-1)**((x%2)+1)) 
num=100 
sum((getx(x) for x in xrange(1,num)))+getx(num)**2 
0.688172179310195