簡體   English   中英

質數遞歸 - 它是如何工作的? (蟒蛇)

[英]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 != 0false ,因此不會對and的右側進行評估。 PrimeHelper(10, 5)將返回false並且不繼續遞歸。
PrimeHelper(10, 6)您得到10 % 6 != 0true ,但我們剛剛看到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完成的,即它有兩個目的:

  1. 返回False
  2. 不要再調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM