python 3.x中的递归is_prime函数

时间:2016-05-15 23:58:46

标签: python python-3.x recursion primes

在我校的计算机科学2课上,我们正在探索递归。我们已经使用递归来做像factorial或Fibonacci序列这样的事情,但是它们被卡在is_prime(n)函数上,如果n是素数则返回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

如果有人能帮助我们一点点,最好只通过一些提示,那就太好了。谢谢!

3 个答案:

答案 0 :(得分:3)

is_prime(n-1)在计算is_prime(n)方面并不十分有用。相反,递归方法会在辅助函数中进行递归,从而完成大部分计算。

类似no_divisors(n,k)的内容,如果范围2,3,...,True不包含k的除数,则评估为n。很容易看出no_divisors(n,k)可以缩减为no_divisors(n,k-1)。定义此函数,然后根据它定义is_prime()。作为优化,你可能想首先检查2和3的可分性作为基础情况,然后查看奇数候选除数。

答案 1 :(得分:0)

可能会递归另一个值而反复检查你的n是不是该值的倍数?像这样:

以d作为上限

开头

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

2)如果n的多个d - 返回true

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

来递归

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

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

答案 2 :(得分:0)

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

  • 以2
  • 开始我们的x
  • 检查是否n % x == 0
  • 如果没有,请递增x并再次调用is_prime函数
  • 如果n < x * x,则n为素数