[英]Prime Number Recursion- How Does It Work? (Python)
我想知道這個程序如何知道一個數字是否為素數。 我知道它會檢查余數以找到要除以的偶數,但它如何知道一個數字只有 2 個因數? 我是遞歸概念的新手,因此對步驟的解釋會有所幫助,謝謝。
代碼
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
它檢查是否有任何從 m - 1 到 1 的數除以 m,它不只檢查偶數。
例如,對於RecIsPrime(10)
您將調用這些嵌套函數:
PrimeHelper(10, 9) = 10 % 9 != 0 and PrimeHelper(10, 8)
↪ PrimeHelper(10, 8) = 10 % 8 != 0 and PrimeHelper(10, 7)
↪ PrimeHelper(10, 7) = 10 % 7 != 0 and PrimeHelper(10, 6)
↪ PrimeHelper(10, 6) = 10 % 6 != 0 and PrimeHelper(10, 5)
↪ PrimeHelper(10, 5) = 10 % 5 != 0 == false
10 % 5 != 0
為false
,因此不會對and
的右側進行評估。 PrimeHelper(10, 5)
將返回false
並且不繼續遞歸。
在PrimeHelper(10, 6)
您得到10 % 6 != 0
為true
,但我們剛剛看到PrimeHelper(10, 5)
為false
因此這也將返回假,所有其他調用也是如此。
這段代碼是一個尾遞歸的情況,即它可以被看作是一種執行迭代的遞歸方式。 請注意,Python 實際上並沒有那樣解釋它(這將是一種優化),但是這樣看仍然很有幫助:
看看PrimeHelper
每個遞歸調用如何具有相同的m值,但其j的值與它在前一次調用中的值相比小一。
因此該代碼可與此變體相媲美:
def RecIsPrime(m):
for j in range(m-1, 1, -1):
if m % j == 0:
return False
return m > 1
在這個變體中,每次迭代都對應於原始代碼中的遞歸調用。 請注意, return False
打破了鏈,這是由原始代碼中的m % j != 0
完成的,即它有兩個目的:
False
PrimeHelper
請務必注意,當您使用 1 或更小的參數調用RecIsPrime
時,這兩個變體的行為方式不同。 在這些情況下,遞歸代碼可能會產生“被零除”錯誤(當RecIsPrime(1)
)或永遠遞歸(例如RecIsPrime(-1)
或任何較小的值)。 這是一個錯誤。 要糾正它更改:
return PrimeHelper(m, m -1)
由
return m > 1 and PrimeHelper(m, m -1)
這也解決了 1 的情況:1 是否是質數不僅僅是“有爭議的” :它絕對不是。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.