在Python 2中生成素数的递归

在Python 2中生成素数的递归,python,recursion,primes,nonetype,Python,Recursion,Primes,Nonetype,我试图使用递归在python中生成素数(因为我发现迭代方法会花费太多的时间,特别是如果想要找到所有的素数,比如一百万左右)。这是我的代码: def primes(n): #to produce prime numbers less than or equal to n if n <= 1: return "No primes that satisfy" elif n == 2: return [2] else: if

我试图使用递归在python中生成素数(因为我发现迭代方法会花费太多的时间,特别是如果想要找到所有的素数,比如一百万左右)。这是我的代码:

def primes(n): #to produce prime numbers less than or equal to n
    if n <= 1:
        return "No primes that satisfy"
    elif n == 2:
        return [2]
    else:
        if all(n%a != 0 for a in primes(n-1)): #A number, n, must not be divisible by any of the prime numbers contained in the list primes(n-1)
          k = primes(n-1).append(n)
          return k
        else:
          S = primes(n-1)
          S = primes(n)
          return S
print primes(5)
def primes(n):#生成小于或等于n的素数

如果n考虑该程序片段:

k = primes(n-1).append(n)
return k
list.append()
的返回值是
None
,因此
k=None
,您可以有效地执行
返回None

试试这个:

k = primes(n-1) + [n]

旁白:OP至少还有一个bug。他们需要删除行
S=primes(n)

考虑以下程序片段:

k = primes(n-1).append(n)
return k
list.append()
的返回值是
None
,因此
k=None
,您可以有效地执行
返回None

试试这个:

k = primes(n-1) + [n]

旁白:OP至少还有一个bug。他们需要删除行
S=primes(n)

我意识到我没有在代码的“if all”部分声明primes(n)。但是,如果我输入“k=primes(n)”,我会遇到“RuntimeError:超过最大递归深度”以及为函数调用赋值的问题。这种递归算法似乎在时间上呈指数增长。对我来说,素数(15)需要.02s,素数(20)需要.2s,素数(25)需要6.4s。因此,每次+5至少需要*10的时间。仅供参考:所以看起来埃拉托斯烯筛是生成素数的最佳方法?当然,这是一种古老的好方法,甚至没有什么改进。我意识到我没有在代码的“如果全部”部分声明素数(n)。但是,如果我输入“k=primes(n)”,我会遇到“RuntimeError:超过最大递归深度”以及为函数调用赋值的问题。这种递归算法似乎在时间上呈指数增长。对我来说,素数(15)需要.02s,素数(20)需要.2s,素数(25)需要6.4s。因此,每次+5至少需要*10的时间。仅供参考:看来埃拉托斯烯筛是生成素数的最佳方法?当然,这是一个很好的老方法,甚至没有什么改进。谢谢你的及时回复。是的,此方法确实有效,但适用于较小的n值,例如n=3。当我测试“primes(5)”时,它遇到了一个运行时错误:“超过了最大递归深度”。有什么办法可以避免这种情况吗?谢谢。修复你的另一个bug。删除行
S=primes(n)
感谢您的及时回复。是的,此方法确实有效,但适用于较小的n值,例如n=3。当我测试“primes(5)”时,它遇到了一个运行时错误:“超过了最大递归深度”。有什么办法可以避免这种情况吗?谢谢。修复你的另一个bug。删除行
S=primes(n)