2017-03-07 7 views
-2

リスト内のすべての数字が素数であるかどうかを判断し、結果に応じてブール値「真」または「偽」を返す必要があります。 forループの中にいくつかの条件文を作って、その数値が素数であるかどうかを調べました。My Forループがリストを反復しない

は、ここでは、コードです:

def all_primes(xs): 
    is_prime = None 
    for i in xs: 
     if i < 2: 
      is_prime = False 
      return is_prime 
      break 
     elif (i % 2 == 0) and (i % i == 1): 
      is_prime = False 
      return is_prime 
      break 
     else: 
      is_prime = True 
      return is_prime 

問題がある、と私はループのリストの最初の値をチェックした後反復を停止し、Pythonのビジュアライザでこれを見ました。文法が私が過去に使ったループと同じである理由は分かりません。

all_primes([5,2,11,37])またはall_primes([5,2,4,37])のようないくつかの値を接続しました。戻り値は、リスト内の最初の番号と反復される唯一の番号であるため、常にtrueです。

理由は何ですか?

+5

'return'あなたの各支店でそれはすぐに機能から壊れます。 'for'ループが完了した後にコードを' return'するように設定する必要があります。 – roganjosh

+3

さらに、 'i%i'は常に0なので、最初の' elif'の 'and'-statementは決して真ではありません。 –

+0

ああ私はそれをキャッチしませんでした。それは私も休憩を取り除かなければならないという意味ですか?ループを閉じるには、単一の値ですら素早く終了する必要があるため、ブレークを使用しています。 –

答えて

4

あなたのif/elseブロックにはreturnbreakがあります。削除する必要があります。また、elsereturnは外になければなりません。または、「素数」が見つかるたびに戻ります。

def all_primes(xs): 
    is_prime = None 
    for i in xs: 
     if i < 2: 
      is_prime = False 
      return is_prime 
     elif (i % 2 == 0): 
      is_prime = False 
      return is_prime 
     else: 
      is_prime = True 
    return is_prime 

この後、実際に素数をチェックしていないことがわかります。ここ は、最も効率的な方法ではありませんが、その明確な方法:

def all_primes(xs): 
    def checkPrime(n): 
     if n < 2: 
      return False 
     for i in xrange(2, n): 
      if n%i == 0: 
       return False 
     return True 
    return all(map(checkPrime, xs)) 

EDIT:map機能のない は、あなただけのforループを反復する必要があります:あなたが持っている

def all_primes(xs): 
    def checkPrime(n): 
     if n < 2: 
      return False 
     for i in xrange(2, n): 
      if n%i == 0: 
       return False 
     return True 
    for n in xs: 
     if not checkPrime(n): 
      return False 
    return True 
+0

「地図」機能を使わずに提案したコードをどうやって書くのですか? –

+0

@PrithviBoinpally、編集を確認してください。 – Netwave

+0

私は編集したコードを試しましたが、残念ながらそのロジックでは動作しないテストケースがいくつかあります。リストの入力が1,3,5,7の場合、1は素数ではなく、負の数ではないため失敗します。 –

1

他の方法で問題が発生するはずです。

プライムではない番号が見つかった場合は、Falseを返し、ループの終了後にTrueを返す必要があります。

関連する問題