1

私は単純なエラトステネスのふるいスクリプトを作成しようとしています.Pythonとコーディング全般を始めたばかりなので、今のところ効率について心配していません.

import math
primes = range(2,500)
upperLimit = math.ceil(math.sqrt(float(primes[-1])))

def sieve(numbers):
    for item in range(0,int(upperLimit)):
        n = numbers[item]
        while n < upperLimit:
            n += numbers[item]
            print n
            print numbers
            numbers.remove(n)

sieve(primes)
print primes

これは、12行目のnumbers.remove(n)が存在しないことを私に伝え続けたので、何が起こっているのかを理解しようとするために、その上にprintステートメントを置きました。それは正常に動作し、本来あるべきものを最大 24 まで削除します。次に、2 を n に再度追加する代わりに、n を 6 に変更します。 .

4

1 に答える 1

2

for ループを初めて使用する場合:

item == 0
starting n == 2
removing 4
removing 6
removing 8
removing 10
removing 12
removing 14
removing 16
removing 18
removing 20
removing 22
removing 24

次の反復:

item == 1
starting n == 3
removing 6 (but 6 is not in the list, because it has already been removed)
ValueError

ご想像のとおり、item == 1, n == numbers[1] == 3. すると、n += numbers[1]になりますn == 6。ただし、6 を 2 回削除することはできないため、エラーが発生します。

于 2012-10-25T06:33:12.887 に答える