2016-03-21 14 views
-1

私はカルクにこの単純なPythonの関数を書いた:Pythonでジェネレータを使用する素数ですか?

def isPrime(number): 
    if number == 2: 
     return True 

    elif number > 1 and number % 2 != 0: 
     for current in range(3, number): 
      if number % current == 0: 
       return False 

     return True 

をそして、それはひどくだしかし、私はプロジェクトeuler #10

のように、1から200万に、すべての素数の合計をプリントアウトし、それを呼んでいます遅く、ジェネレータを使って同じ問題に取り組むことができるかどうか疑問に思っていましたか?しかし、私は実際に完全にPythonのジェネレータを理解していません。

この問題をより効率的に解決する方法については、ご了承ください!ありがとう:)

+0

なぜすべての数値をチェックしますか? –

+2

改善の余地がある、完全で機能するコードブロックは、[コードレビュースタックエクスチェンジ](http://codereview.stackexchange.com/)で参照できます。投稿する前にそのサイトのヘルプセンターを確認してください – wnnmaw

答えて

0

まず、数字が素数であるかどうかを調べるために、より良い関数を使用することをお勧めします。 https://jeffknupp.com/blog/2013/04/07/improve-your-python-yield-and-generators-explained/より良い修正があります。これは、Pythonのジェネレータに関する優れた の説明です。

import math 

def is_prime(number): 
    while True: 
     if number == 2: 
      return True 
     elif number > 1 and number % 2 != 0: 
      for current in range(3, int(math.sqrt(number) + 1), 2): 
       if number % current == 0: 
        return False 
      return True 
     return False 

第2に、Generatorが実際に何をしているのかを理解する必要があります。再びJeff Knuppはそれを完全に説明します。 要するに、ジェネレータは「返す」関数ではなく、単に「yield」し、next()メソッドが呼び出されたときに制御を取り戻します。 したがって、関数中に作成される変数は失われず、関数で定義された変数を何度も作成しないことによってメモリが節約されます。

次に、リンクにも説明されているオイラー10の解答を続けることができます。 :)

残りのオイラーと幸運を祈る!

0

この問題に対する別の狙いは、現在の方法を最適化するのではなく、別のアルゴリズムを試すことです。ジェネレータについてもっと学ぶことは素晴らしいですが、これも非常に効率的なsieveを使って解決することができます。

一般的な考え方は、すべての合成数(素数ではない)を「マーク」して素数を残すことです。私のpython実装が〜3.5sで動作するので、かなり効率的です。

関連する問題