Возможно переполнение?

Моя программа работает для меньших чисел, таких как 144,123 или 60, но, кажется, перестает работать, когда числа увеличиваются по величине. Я прошел вводный курс по с ++ и смутно помню переполнения. Тем не менее, я не уверен, как именно переменные Python работают точно, так как тип переменной явно не объявляется. 1024 кажется слишком маленьким для переполнения целого числа, но, возможно, я пропускаю что-то в рамках рекурсии, поскольку я только начинаю получать рекурсию зависания. Может кто-нибудь объяснить мне, почему этот алгоритм ломается при больших числах?

Код

num = 1024

#Used to remove duplicates of the same prime
def simplify (num,prime):
    if(num % prime == 0):
        return simplify(num/prime,prime)
    else:
        return (num,num)

#used to find the prime factors
def pFact(num,a,b):
    if a == 1:
        return
    elif b == 1:
        print (a, "is a prime")
        return pFact((simplify (num,a))[0],(simplify (num,a))[1],a)
    elif a % b == 0:
        return pFact(num,b,b-1)
    elif a % b != 0:
        return pFact (num,a,b-1)
    elif b == 0:
        return (num,num,num-1)

pFact(num,num,num-1)

Выход

RecursionError: максимальная глубина рекурсии превышена по сравнению

Процесс вернул 1 (0x1) время выполнения: 0,082 с Нажмите любую клавишу для продолжения.,,

1 ответ

Поскольку все рекурсивные вызовы выполняются в конце функции, вы можете использовать оптимизацию Tail Call Baruchel для Python (устанавливается с pip install tco):

from tco import with_continuations
num = 10240

#Used to remove duplicates of the same prime
def simplify (num,prime):
    if(num % prime == 0):
        return simplify(num/prime,prime)
    else:
        return (num,num)

#used to find the prime factors
@with_continuations()
def pFact(num,a,b, self=None):
    if a == 1:
        return
    elif b == 1:
        print (a, "is a prime")
        return self((simplify (num,a))[0],(simplify (num,a))[1],a)
    elif a % b == 0:
        return self(num,b,b-1)
    elif a % b != 0:
        return self(num,a,b-1)
    elif b == 0:
        return (num,num,num-1)

pFact(num,num,num-1)

Это выводит:

5 is a prime
2 is a prime
Другие вопросы по тегам