我想知道这个程序怎么知道一个数是不是素数。我知道它会检查余数,找出要除以的偶数,但它怎么知道一个数只有两个因子?我对递归的概念还不熟悉,所以对这些步骤的解释会很有帮助的,谢谢。在
编码
def RecIsPrime(m):
"""Uses recursion to check if m is prime."""
def PrimeHelper(m, j):
"""Helper Function to iterate through all j less than m up to 1 to look for even divisors."""
if j == 1: # Assume 1 is a prime number even though it's debatable.
return True
else:
#do this task if both conditionals are true
#else break and return false.
return m % j != 0 and PrimeHelper(m, j - 1)
return PrimeHelper(m, m -1)
来源
https://github.com/hydrogeologist/LearningPython/blob/master/_recursion%20example%20in%20Python
线路:184至194
这段代码是一个尾部递归的情况,也就是说,它可以看作是执行迭代的递归方式。请注意,Python实际上并不是这样解释的(这是一种优化),但是这样看还是有帮助的:
看看
PrimeHelper
的每个递归调用对m的值是如何相同的,但是对于j的值与在上一次调用中的值相比少了一个。在因此,代码与此变体相当:
在这个变量中,每次迭代都对应于原始代码中的递归调用。请注意,
return False
断开了链,这是由m % j != 0
在原始代码中完成的,即它有两个用途:False
PrimeHelper
需要注意的是,当您使用小于等于1的参数调用
^{pr2}$RecIsPrime
时,这两个变量的行为方式不同。在这些情况下,递归代码可以产生“除以零”错误(当RecIsPrime(1)
)或永远递归(例如RecIsPrime(-1)
或任何更小的值)。这是个虫子。要更正它,请更改:通过
这也修正了1的情况:1是否是质数不仅仅是一个值得商榷的问题:它绝对不是。在
它检查是否有从m-1到1的数除以m,它不检查偶数。在
例如,对于
RecIsPrime(10)
,您将有这些嵌套函数调用:10 % 5 != 0
是false
,所以{PrimeHelper(10, 5)
将返回false
,并且不会继续递归。在
PrimeHelper(10, 6)
中,10 % 6 != 0
为true
,但我们刚刚看到{相关问题 更多 >
编程相关推荐