在我校的计算机科学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
如果有人能帮助我们一点点,最好只通过一些提示,那就太好了。谢谢!
答案 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
。要递归地执行此操作:
x
n % x == 0
is_prime
函数n < x * x
,则n
为素数