Создание итератора простых чисел
Нужно реализовать класс PrimesIterator, позволяющий итерироваться по простым числам, начиная с заданного. Примеры использования:
for n in PrimesIterator(42): print(n)
for n in PrimesIterator(): print(n)
Что не так с моим кодом?
from math import sqrt
from itertools import count, islice
def is_prime(n):
return n > 1 and all(n % i for i in islice(count(2), int(sqrt(n) - 1)))
class PrimesIterator:
def __init__(self, start=0):
self.start = start
def __iter__(self):
return self
def __next__(self):
self.start += 1
if is_prime(self.start):
return self.start
else:
return self.__next__()
ЯндексКонтест:
test_primes_iterator (__main__.SampleTestSuite) ... FAIL
======================================================================
FAIL: test_primes_iterator (__main__.SampleTestSuite)
----------------------------------------------------------------------
Traceback (most recent call last):
File "run_tests.py", line 34, in test_primes_iterator
self.assertEqual(nums, expected_nums)
AssertionError: Lists differ: [1009, 1013, 1019, 1021, 1031, 1033, 1039,[553 chars]1721] != [997, 1009, 1013, 1019, 1021, 1031, 1033, [552 chars]1709]
First differing element 0:
1009
997
Diff is 956 characters long. Set self.maxDiff to None to see it.
----------------------------------------------------------------------
Ran 1 test in 0.004s
FAILED (failures=1)
0.0
Ответы (2 шт):
Автор решения: Dylan Vergara
→ Ссылка
def __next__(self):
temp = self.start
self.start += 1 #if u dont do that, the number wich u will start is the next of that u want
if is_prime(temp):
return temp
else:
return self.__next__()
Автор решения: CrazyElf
→ Ссылка
Судя по всему, нужно переделать код так, чтобы в случае, если переданное при инициализации число уже простое, оно тоже попало в выдачу. Ну и рекурсию я убрал, в питоне рекурсия не бесконечная, плюс к тому она забивает стек лишними данными, обычно всегда можно обойтись без рекурсии:
def __next__(self):
# ищем простое число, начиная с текущего
while not is_prime(self.start):
self.start += 1
# запомним его, чтобы вернуть
ret = self.start
# увеличим, чтобы дальше искать следующее
self.start += 1
# возвращаем запомненное
return ret