当我 运行 递归算法时 Spyder 内核重新启动
Spyder kernel restarts when I run a recursive algorithm
import random
def gcd(a,b):
if a < b:
b = b - a
return gcd(a,b)
elif a > b:
a = a - b
return gcd(a,b)
else:
return a
def f(x,n):
return (x**2 + 1) % n
def PolRho(n):
x = random.randint(2,n)
y = x
d = 1
while d == 1:
x = f(x,n)
y = f(f(y,n),n)
print(x,y)
d = gcd(abs(x-y),n)
if d == n:
return PolRho(n)
return [d,n/d]
print(PolRho(16))
这是我的 Pollard 算法代码。该代码适用于 'print(PolRho(15))',但如果我尝试任何其他值(例如 'print(PolRho(16))'
,内核将重新启动
我在 Spyder 4.1.4 下的 Python 3.8.3 中尝试了您的代码,PolRho(15)
运行良好,但 PolRho(16)
引发错误,并且(很长!)堆栈跟踪以
结尾
File "D:\polrho.py", line 13, in gcd
return gcd(a,b)
File "D:\polrho.py", line 11, in gcd
if a < b:
RecursionError: maximum recursion depth exceeded in comparison
所以我不知道为什么你的Spyder内核重启了也不报错,但是潜在的问题是你的递归已经达到了Python的最大栈深度
如果您确实需要此代码按照编写的方式工作,您可以尝试increasing the stack depth, but a more reliable method would be to use math.gcd 查找最大公约数而不是递归方法。
如果您怀疑 Spyder(或任何其他 IDE)可能涉及您在 Python 代码中看到的问题,您应该始终尝试 运行 来自命令行,例如
python polrho.py
import random
def gcd(a,b):
if a < b:
b = b - a
return gcd(a,b)
elif a > b:
a = a - b
return gcd(a,b)
else:
return a
def f(x,n):
return (x**2 + 1) % n
def PolRho(n):
x = random.randint(2,n)
y = x
d = 1
while d == 1:
x = f(x,n)
y = f(f(y,n),n)
print(x,y)
d = gcd(abs(x-y),n)
if d == n:
return PolRho(n)
return [d,n/d]
print(PolRho(16))
这是我的 Pollard 算法代码。该代码适用于 'print(PolRho(15))',但如果我尝试任何其他值(例如 'print(PolRho(16))'
,内核将重新启动我在 Spyder 4.1.4 下的 Python 3.8.3 中尝试了您的代码,PolRho(15)
运行良好,但 PolRho(16)
引发错误,并且(很长!)堆栈跟踪以
File "D:\polrho.py", line 13, in gcd
return gcd(a,b)
File "D:\polrho.py", line 11, in gcd
if a < b:
RecursionError: maximum recursion depth exceeded in comparison
所以我不知道为什么你的Spyder内核重启了也不报错,但是潜在的问题是你的递归已经达到了Python的最大栈深度
如果您确实需要此代码按照编写的方式工作,您可以尝试increasing the stack depth, but a more reliable method would be to use math.gcd 查找最大公约数而不是递归方法。
如果您怀疑 Spyder(或任何其他 IDE)可能涉及您在 Python 代码中看到的问题,您应该始终尝试 运行 来自命令行,例如
python polrho.py