Python3.x中的递归is_素数函数

Python3.x中的递归is_素数函数,python,python-3.x,recursion,primes,Python,Python 3.x,Recursion,Primes,在我学校的计算机科学2课上,我们正在探索递归。我们已经使用递归来做阶乘或斐波那契序列之类的事情,但是我们仍然停留在is_prime(n)函数上,如果n是prime,它将返回True,否则将返回False。我们以前以迭代方式编写过一个,但似乎不知道如何以递归方式进行。这就是我们目前的情况: def is_prime(n): if n < 2: return False #1 or 0 is not prime, base case 1 if n == 2 or n

在我学校的计算机科学2课上,我们正在探索递归。我们已经使用递归来做阶乘或斐波那契序列之类的事情,但是我们仍然停留在
is_prime(n)
函数上,如果n是prime,它将返回True,否则将返回False。我们以前以迭代方式编写过一个,但似乎不知道如何以递归方式进行。这就是我们目前的情况:

def is_prime(n):

    if n < 2: return False
    #1 or 0 is not prime, base case 1

    if n == 2 or n == 3: return True
    #2 and 3 are both prime, base case 2

    if is_prime(n-1): return False
    #This checks if n-1 is prime, b/c if so then n must not be prime
    #However, this only works b/c the first few numbers have lots of primes

    return True
    #Only returns True if nothing else has returned
def为素数(n):
如果n<2:返回False
#1或0不是素数,基本情况1
如果n==2或n==3:返回True
#2和3都是基本情况2
如果是素数(n-1):返回False
#这将检查n-1是否为素数,b/c如果是,则n不得为素数
#然而,这只适用于b/c,前几个数字有很多素数
返回真值
#仅当未返回任何其他内容时才返回True

如果有人能帮我们一点忙,最好是给我们一些提示,那就太好了。谢谢

可以在另一个值上递归,并反复检查n是否不是该值的倍数?像这样:

以d开头作为上限

1) 如果d已达到下限-返回false

2) 如果n是d的倍数-返回true

3) 默认情况-通过减少d递归

您可以选择下限和上限的含义。(例如,从2到n/2是最基本的方法)


另一种可能的上下限方法是将d从sqrt(n)递归到2,甚至是事先检查除以2并跳过一些值等。

确定素性的一种简单方法是测试区间[2,sqrt(n)]中的所有整数x是否
n%x==0
。要递归地执行此操作,请执行以下操作:

  • 在2点开始我们的
    x
  • 检查
    n%x==0
  • 如果不是,则增加x并再次调用
    is\u prime
    函数
  • 如果
    n
    n
    为素数
是素数(n-1)
在计算
是素数(n)
时没有太大帮助。相反,递归方法将在执行大部分计算的辅助函数中进行递归


类似于
no_除数(n,k)
的东西,其计算结果为
True
如果范围2,3,
k
不包含
n
的除数。不难看出,
no_除数(n,k)
可以简化为
no_除数(n,k-1)
。定义此函数,然后根据它定义
is_prime()
。作为一种优化,您可能需要首先检查2和3的可分性作为基本情况,只需查看奇数候选因子。

如果
n-1
是素数,而
n>3
n
是复合的。除了这些琐碎的观察,了解
n-1
会发生什么对
n
几乎没有什么帮助。没有很好的方法可以将检查
n
是否为素数的问题简化为检查
n-1
是否为素数的问题。老实说,我认为这不是递归的好选择。迭代解决方案将更简单、更快。我知道你在这件事上别无选择,但对我来说,这似乎是一个愚蠢的任务。@TomKarzes我同意在Python(或大多数语言)中这样做没有什么意义,但有一些语言像Lisp,其中大多数计算是递归完成的。一个好的计算机科学入门课程应该让学生接触到各种各样的范例,因此,作为一个学习练习,找出如何递归地做这样的事情是有意义的。