当我 运行 递归算法时 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