【问题标题】:Recursive is_prime function in python 3.xpython 3.x中的递归is_prime函数
【发布时间】:2016-09-11 17:06:52
【问题描述】:

在我学校的计算机科学 2 课上,我们目前正在探索递归。我们已经使用递归来执行阶乘或斐波那契数列之类的事情,但被困在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

如果有人可以帮助我们一点,最好只是通过几个提示,那就太好了。谢谢!

【问题讨论】:

  • 如果n-1 是素数而n &gt; 3 那么n 是复合数。除了这个微不足道的观察之外,知道n-1 会发生什么,你对n 知之甚少。没有很好的方法可以减少检查n 是否为质数的问题,而不是检查n-1 是否为质数的问题。
  • 说实话,我认为这不是递归的好选择。迭代解决方案将更简单、更快。我知道你在这件事上别无选择,但对我来说,这似乎是一项愚蠢的任务。
  • @TomKarzes 我同意在 Python(或大多数语言)中这样做没有什么意义,但是在像 Lisp 这样的语言中,大多数计算都是递归完成的。一门好的计算机科学入门课程应该让学生了解各种范式,因此作为一种学习练习来弄清楚如何递归地做这样的事情是有意义的。

标签: python python-3.x recursion primes


【解决方案1】:

is_prime(n-1) 对计算 is_prime(n) 没有太大帮助。相反,递归方法将在一个辅助函数中进行递归,该函数执行大部分计算。

如果范围 2、3、...、k 不包含 n 的除数,则类似于 no_divisors(n,k) 的结果为 True。不难看出no_divisors(n,k)可以简化为no_divisors(n,k-1)。定义这个函数,然后根据它定义is_prime()。作为一种优化,您可能希望首先检查可被 2 和 3 整除作为基本情况,然后只查看奇数候选除数。

【讨论】:

    【解决方案2】:

    也许递归另一个值并反复检查您的 n 不是该值的倍数?像这样:

    以 d 作为上限

    开始

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      • 在 2 开始我们的 x
      • 检查是否n % x == 0
      • 如果不是,则增加 x 并再次调用 is_prime 函数
      • 如果n &lt; x * x 那么n 是素数

      【讨论】:

        猜你喜欢
        • 2018-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-03
        • 1970-01-01
        • 2014-01-10
        • 2012-11-22
        • 2017-06-14
        相关资源
        最近更新 更多