可能是溢出?

时间:2018-09-01 03:06:39

标签: python function recursion overflow prime-factoring

我的程序适用于较小的数字,例如144,123或60,但是当数字数量级增加时,似乎停止工作。我参加了C ++入门课程,我隐约记得有溢漏。但是,我不确定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 s 按任意键继续 。 。

1 个答案:

答案 0 :(得分:0)

由于所有递归调用均在函数末尾进行,因此您可以使用baruchel's Tail Call Optimization for 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
相关问题