繁体   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