簡體   English   中英

best_divisor() function 的遞歸算法是什么?

[英]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.

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