4

私はシリーズの合計を見つけようとしています:1 − 1 / 2 + 1 / 3 − 1 / 4 + · · · + 1 / 99 − 1 / 100 ** 2Pythonを使用します。

私のコードは-

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のランダムな練習です。

4

5 に答える 5

5

これは問題なく機能しますが、1つの「合計」変数を使用して(実際には非表示にしたくないtotal組み込みのと呼ばれるものがあるため、これを呼び出してください)、実際に加算または減算しないのはなぜですかsum各ステップでそれ?

あるいは(しゃれを意図した!)、実際にその機能を使用sumします。このrange関数を使用して、1つおきの番号をスキップすることもできます。

>>> 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を適宜加算)で処理できます。 。これが、プログラマーとしてもっと数学を学ぶべき理由です:)

于 2012-05-11T20:50:46.357 に答える
4

まあ、私は信じています

import math
print math.log(2)

トリックを行います。

于 2012-05-11T20:59:44.730 に答える
3
sum(1.0/k if k % 2 else -1.0/k for k in xrange(1, 100)) - 1.0/100**2

上記のコードはあなたのコードと同じことをし、同じ答えを得ます。

シリーズが1から99までの1/kを使用し、次にk==100の場合にのみ1/k ** 2を使用するのはなぜですか?

于 2012-05-11T20:50:00.500 に答える
1

正しく実行されているかどうかを確認する最も簡単な方法は、手作業で確認できる、はるかに短いシリーズで試してみることです。たとえば、range(1、5)を使用して、期待する答えが得られるかどうかを確認します。

スタイルのヒントについては、範囲の代わりにxrangeを使用できます。xrangeは必要に応じて各数値を返すだけなので便利ですが、rangeはすべての数値の大きなリストを作成します。range(1、1000000)に対してこれを行うと、多くのメモリを消費しますが、xrangeは消費しません。

また、合計の変数を2つではなく1つにすることもできます。

于 2012-05-11T20:52:10.217 に答える
0

これが私の提案です。@stevehaよりもLOCは少し多いですが、より一般的です。

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
于 2012-05-11T21:17:36.407 に答える