2015-07-31 2 views
0

Я пишу простую программу, которая дает список всех простых чисел. меньше заданного нет. N. У меня возникла проблема с тем, что мой счетчик check в функции primes_gen else не обновляется. Хотя, когда я использую ту же логику без функции, как упоминание во втором фрагменте кода, все работает правильно.Python, для счетчика циклов не обновляется?

логика применяется: -

  1. когда n передается функции <= 2, пустой список возвращается

  2. когда n является > 2, range(3,n,2) идентифицирует все нечетные числа. Это первый шаг, отмеченный в первом фрагменте кода.

  3. второй для цикла, обозначенный шагом 2, проверяет, нет ли. делится на все № менее i. Если да, то чек счетчик увеличивается на +1 и этот цикл завершается «продолжить»

  4. если чек остается нулевым до конца для цикла, то i присоединяемого к списку и, наконец, после завершения списка петли возвращается.

Проблема: -

-The список я получил в результате был [2], который неправильно анс. поэтому я написал шаг 3, как отмечено в первом фрагменте, и я обнаружил, что мой счетчик не обновляется после «continue», как показано на выходе. когда такая же логика применяется без функции, написанной во втором фрагменте кода, все работает правильно. Я не могу понять, что здесь не так, почему check не обновляется после continue?

contents =['10'] 

def prime_gen(n): 
    num_list=[2] 
    if n <=2: 
     return [] 
    else: 
     for i in range(3,n,2): #step 1 
      check=0 
      for u in (2,i):  #step 2 
       if i%u == 0: 
        check += 1 
        continue 
      print (check,i)  #step 3 
      if check == 0: 
       num_list.append(i) 
    return num_list 

if __name__== '__main__': 
    for j in range(len(contents)): 
      print (int(contents[j])) 
      num_list = prime_gen(int(contents[j])) 
      print (str(num_list).replace('[','').replace(']','')) 

Выход

10 
1 3 
1 5 
1 7 
1 9 
2 

Ожидаемое АНС (если шаг 3 выше комментарий)

10 
2, 3, 5, 7 

второго кода без функции

contents = ['10'] #to-check 


for i in range(len(contents)): 
    target = int(contents[i]) 
    num_list= [2] 
    for j in range(3,target,2): 
     check = 0 
     for u in range(2,j): 
     if j%u == 0: 
      check +=1 
      continue 
    if check == 0: 
     num_list.append(j) 
#print (num_list) 
print (str(num_list).replace('[','').replace(']','')) 

выход

2, 3, 5, 7 

ответ

4

Ваша проблема заняла второе место, но ее очень просто решить. Проблема заключается в вашем «Шаге 2». У вас есть линия

for u in (2,i):  #step 2 

u, который перебирает через все переменные в кортеже вы предоставляете, а именно 2 и i. Конечно, i%i будет 0, поэтому check всегда будет правдой. То, что вы хотите вместо того, чтобы это:

for u in range(2,i):  #step 2 

Это итерацию u через все переменные между 2 и i, как вы намерены.

Смотрите эти два примера:

>>> i = 7 
>>> for u in (2,i): print u, 

2 7 
>>> for u in range(2,i): print u, 

2 3 4 5 6 

В принципе, вы просто забыли использовать range в вашей цикл, и что собирается дать вам дико разные результаты, чем то, что вы на самом деле хотите.

+0

так что это была довольно глупая ошибка: '(. Спасибо Brien – CbK

+0

Нет проблем, мы все были там :) – Brien

+0

@CbK, так как это решило вашу проблему, подумайте о принятии этого ответа, чтобы показать другим, что это было полезно для вы. – Brien