Код выводит значения много раз
class TestMeCode:
n = 1000 # Пока не нужна
z = 2 # Первое число с которого будут искатся простые числа
s = [] # Список в которые суётся все делители
a = [] # Список в который суётся все простые делители
def Dragon(self):
i = 1
while i <= self.z + 1:
if i >= self.z + 1: # Когда алгоритм заканчивает работу
self.Dragon2()
if self.z % i == 0: # Алгоритм вычисления всех делителей
self.s.append(i) # Добавляет детели в список
i += 1
def Dragon2(self):
# Заканчивает алгортим как только будет найдено 11 простых делитей
if len(self.a) == 11:
# Выводит на экран последний найдёный элемент
print(self.a[-1])
return
# Всего делятся на два числа(простой делитель)
if len(self.s) == 2:
# Добавляем простые делители в этот список
self.a.append(self.z)
# Очищаем первый список чтобы продолжать работу с алгоритмом
self.s.clear()
# Добавляем один чтобы не появлялось одно и тоже число
self.z += 1
# Перекидавает на первый алгоритм чтобы продолжать поиск простых делителей
self.Dragon()
else:
# Если больше двух делителей то добавляем один
self.z += 1
# И очищаем список чтобы продолжать работать с алгортимом
self.s.clear()
# Перекидавает на первую функцию
self.Dragon()
TestMeCode().Dragon()
Почему он выводит число не один раз, а 29 раз?,алгоритм вычисляет простые числа и добавляет их в список.
Ответы (2 шт):
Ответ на вопрос: он выводит их много раз (у меня, кстати, число 31 выводится 31 раз, а не 29) потому, что он зацикливается после достижения переменной i значения 33 (в моём случае) и Dragon c Dragon2 друг друга непрерывно вызывают до выполнения некоего условия.
Дополнительно: что именно вы хотели получить, мне сложно сказать, так как зачем так написан код мне не понятно, но я бы начал с того, что разобрался, а число 31 или 29 -то, что должно было выводиться? Если нет, то сначала надо устранить ошибку на более раннем этапе, и лишь затем искать ошибки на последующих шагах. Если да, то смотрите логику в Dragon, зачем он столько раз вызывает Dragon2, откуда печать идет? Самое правильное, на мой взгляд - в PyCharm по шагам погонять его.
Добавьте оператор break при помощи которого произойдет выход из цикла вызывающего функцию. Ну а вообще да, надо логику программы менять
class TestMeCode:
n = 1000 # Пока не нужна
z = 2 # Первое число с которого будут искатся простые числа
s = [] # Список в которые суётся все делители
a = [] # Список в который суётся все простые делители
def Dragon(self):
i = 1
while i <= self.z + 1:
if i >= self.z + 1: # Когда алгоритм заканчивает работу
self.Dragon2()
break
if self.z % i == 0: # Алгоритм вычисления всех делителей
self.s.append(i) # Добавляет детели в список
i += 1
def Dragon2(self):
# Заканчивает алгортим как только будет найдено 11 простых делитей
if len(self.a) == 11:
# Выводит на экран последний найдёный элемент
print(self.a)
return
# Всего делятся на два числа(простой делитель)
if len(self.s) == 2:
# Добавляем простые делители в этот список
self.a.append(self.z)
# Очищаем первый список чтобы продолжать работу с алгоритмом
self.s.clear()
# Добавляем один чтобы не появлялось одно и тоже число
self.z += 1
# Перекидавает на первый алгоритм чтобы продолжать поиск простых делителей
self.Dragon()
else:
# Если больше двух делителей то добавляем один
self.z += 1
# И очищаем список чтобы продолжать работать с алгортимом
self.s.clear()
# Перекидавает на первую функцию
self.Dragon()
TestMeCode().Dragon()
