如何在Python中使用递归查找素数

如何在Python中使用递归查找素数,python,python-3.x,recursion,primes,Python,Python 3.x,Recursion,Primes,我必须使用递归找出数字(N)是否是素数,不允许循环。我曾尝试将使用for循环的常用代码转换为递归代码,但其行为并不相同。此函数包含在另一个函数中,该函数是另一个函数的一部分。仅应使用和传递参数a和N 这是我的功能 a=2 def is_prime(a,N): prime = True if N <=1: return else: if a >= N: return else: if N == 2:

我必须使用递归找出数字(N)是否是素数,不允许循环。我曾尝试将使用for循环的常用代码转换为递归代码,但其行为并不相同。此函数包含在另一个函数中,该函数是另一个函数的一部分。仅应使用和传递参数a和N 这是我的功能

a=2
def is_prime(a,N):
prime = True
if N <=1:
    return 
else:
    if a >= N:
        return 
    else:
        if N == 2: 
            prime = True
            print(N)
            return 
        elif (N % a) == 0:
            prime = False
            return is_prime(a+1,N)
        else:
            prime = True
            print(N)

return
这是我试图转换的代码

if num > 1:
   for i in range(2,num):
      if (num % i) == 0:
         print(num,"is not a prime number")
         print(i,"times",num//i,"is",num)
         break
   else:
      print(num,"is a prime number")

else:
   print(num,"is not a prime number")

您的解决方案已接近尾声,只需进行一些更改即可实现

def is_prime(a,N):
    print(a, N)
    if N <= 1:
        return 
    else:
        if a >= N:
            print(N)
        else:
            if N == 2: 
                print(N)
            elif (N % a) == 0:
                return False
            else:
                return is_prime(a+1,N)

    return False
我认为您误解了递归的工作原理,您在函数体中指定了这个
prime
变量,但从未对它做过任何事情。也许您的困惑来自于对Python中作用域的误解。
prime
变量不会在调用之间“共享”,每次它只会创建一个新的
prime


编辑:没有意识到您希望函数只打印素数(如果是素数),因此相应地更改了代码。

因为目标是打印素数,所以让我们先做这部分。您的代码中已经有一个条件,但没有打印:

if a >= N:
    print(N)
    return
接下来,我们需要处理
N>1
的所有情况:

if N == 2: 
    prime = True
    print(N)
    return 
elif (N % a) == 0:
    prime = False
    return is_prime(a+1,N)
else:
    prime = True
    print(N)
首先检查,
if N==2
是不必要的,因为之前已经有一个块处理
N
为素数的所有情况,因此可以删除它。也就是说,把它放在那里不会造成任何伤害

检查
N
是否可被
a
整除的下一个块应终止递归。既然你知道
N
不是素数,你就到此为止

N
不能被
a
整除时执行的最后一个块应该执行递归。现在,只要
N%a!=0
这显然是错误的

下面是一个包含上述修改和清理的工作示例:

def is_prime(N, a=2):
    if N <= 1:
        return
    elif a >= N:
        print(N)
    elif N % a != 0:
        is_prime(N, a + 1)
def为素数(N,a=2):
如果N=N:
打印(N)
elif N%a!=0:
is_素数(N,a+1)

您的函数有时返回某些内容,有时不返回任何内容——它应该是一个或另一个,而不是两个都返回。在这种情况下,
is_prime()
看起来像一个布尔函数,因此它应该返回True或False。我们将把打印留给调用方:

def is_prime(N, a=3):

    if N == 2:  # special case
        prime = True
    elif N <= 1 or N % 2 == 0:  # too small or even
        prime = False
    elif a * a > N:  # tried all divisors to sqrt, must be prime
        prime = True
    elif (N % a) == 0:  # divides evenly, not a prime
        prime = False
    else:  # can't tell yet, recursively try the next (odd) divisor
        prime = is_prime(N, a+2)

    return prime

for x in range(100):
    if is_prime(x):
        print(x)
def为素数(N,a=3):
如果N==2:#特殊情况
素数=真
elif N:#尝试了所有除数来sqrt,必须是素数
素数=真
elif(N%a)=0:#等分,而不是素数
素数=假
else:#还不知道,递归地尝试下一个(奇数)除数
素数=素数(N,a+2)
返回素数
对于范围(100)内的x:
如果是_素数(x):
打印(x)
保持简单。仔细考虑每一种可能的情况。避免不必要地增加缩进深度,这会使代码更加复杂

上述解决方案试图通过避免偶数(除数和数)并将除数限制在数的平方根来加速素数检测。这可能很重要,因为如果没有这些优化,递归解决方案可能会在N=1000左右耗尽调用堆栈空间,而在不扩展调用堆栈的情况下,上述值应达到N=1000000。

def prime(N,j):
def prime(n,j):
    if(n<2):
        return False
    if(j==n):
        return True
    if(n%j==0):
        return False
    return prime(n,j+1)

print(prime(n,2))

如果(n打印给定范围内的素数列表

l=[]
def primenum(x,y):
    global l
    if x==y:
        print(l)
    else:
        m=0
        for i in range(1,x+1):   
            if x%i==0:
                m+=1
        if m==2 or x==1:
            l+=[x,]
            return primenum(x+1,y)
        else:
            primenum(x+1,y)
while循环
def为素数(n):
如果n==1:
返回错误
i=2

虽然我*i可能重复函数是否应该返回任何内容?@hd1,但我不同意重复调用。这特别要求使用不带任何循环的递归解决方案。该解决方案显然使用循环。不,它只是用于打印(N)如果它是素数。此函数是另一个函数的一部分。@请添加一些说明,使其更易于理解,并说明为什么具有此函数很好
def prime(n,j):
    if(n<2):
        return False
    if(j==n):
        return True
    if(n%j==0):
        return False
    return prime(n,j+1)

print(prime(n,2))
l=[]
def primenum(x,y):
    global l
    if x==y:
        print(l)
    else:
        m=0
        for i in range(1,x+1):   
            if x%i==0:
                m+=1
        if m==2 or x==1:
            l+=[x,]
            return primenum(x+1,y)
        else:
            primenum(x+1,y)
def is_prime(n):
  def prime_helper(n, x):
    if n == 1:
      return False
    elif n % x == 0:
      return False
    else:
      return prime_helper(n , x+1) if x * x <= n else True 
  return prime_helper(n, 2)
def is_prime(n, x=2):
    if n == 1:
      return False
    elif n % x == 0:
      return False
    else:
      return is_prime(n , x+1) if x * x <= n else True 
from math import sqrt 
def is_prime(n):
  if n == 1:
     return False
  for i in range(2, round(sqrt(n)) + 1):
     if n % i == 0:
        return False
  return True
def is_prime(n):
  if n == 1:
    return False
  i = 2
  while i * i <= n:
     if n % i == 0:
        return False
     i += 1
  return True