6

以下の [Python 3.4] のプログラムは、単純なエラトステネスふるいです。

from itertools import *
def excl(ns,pr):
    return (i for i in ns if i%pr)
def sieve(ns):
    while True:
        pr=next(ns)
        yield pr
        ns=excl(ns,pr)
        # ns=(i for i in ns if i%pr)
r=list(islice(sieve(count(2)),10))

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29] を生成します。わかった。excl() をインライン化する行のコメントを外し、呼び出しをコメントにすると、[2, 3, 4, 5, 6, 7, 8, 9, 10, 11] が得られます。なんで?

それを反復するループ内でシーケンスを変更するときに予想されるトラブルに関連していますか?

ヒントをありがとう。

4

1 に答える 1

2

問題はpr、ジェネレーター式によって参照されるものが、while ループの次の反復で変更するものと同じprであるため、前の「素数」数で割り切れないすべての数が「素数」として扱われることです。それ自体が変更するprなどです。excl関数では、pr参照するのは引数として渡されたものであり、変更されることはありません。

于 2015-10-17T20:33:11.913 に答える