[英]What is the recursive algorithm for greatest_divisor() function?
首先,我想做的不是最大的 COMMON divisor 。 我試圖找到最大的除數。 例如,對於數字 12,我的最大除數將是 6。對於數字 15,它將是 5,對於 17,它將是 1。
我所做的是通過迭代:
def greatest_divisor(n):
for d in range(n-1,0,-1):
if n % d == 0:
return d
break
greatest_divisor(12)
>6
運行正常。 我需要的是這個 function 的遞歸形式。 如果你能想出一些有用的東西,我很感激!
通常,如果您首先找到最小除數(大於 1),然后將n除以該除數以獲得最大除數,則通常需要較少的迭代。 在這種情況下,您不必迭代超過n的平方根。 如果沒有找到,則返回 1。
這是針對該問題的迭代解決方案:
def greatest_divisor(n):
for low in range(2, int(n**0.5)+1):
if n % low == 0:
return n // low
return 1
使這種遞歸實際上沒有任何好處,因為這只是尾遞歸的一種情況:
def greatest_divisor(n, low=2):
if n % low == 0:
return n // low
if low*low > n:
return 1
return greatest_divisor(n, low+1)
首先,我將從數學上的評論開始:找到最大的除數與找到最小的除數(但為 1)是一樣的,並且那個最小的除數將是素數。 如果您想搜索大量值,該屬性可能會導致更有效的算法。
接下來,通過定義起點和停止條件,可以將任何迭代方法重寫為遞歸方法。 通常會避免這種情況,因為如果遞歸太深,遞歸方法會影響堆棧和中斷,而迭代方法只需要恆定的資源。
所以這里直接轉換自己的代碼是:
def r_greatest_divisor(n, cur=None):
if cur is None:
cur = n - 1
if cur <= 1:
return 1
if n % cur == 0:
return cur
return r_greatest_divisor(n, cur - 1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.