Код выводит значения много раз

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 по шагам погонять его.

→ Ссылка
Автор решения: CameL

Добавьте оператор 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()
→ Ссылка