【问题标题】:What is the recursive algorithm for greatest_divisor() function?best_divisor() 函数的递归算法是什么?
【发布时间】:2021-03-20 16:16:06
【问题描述】:

首先,我想做的是不是最大的常见除数。我试图找到最大的除数。例如,对于数字 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

运行正常。 我需要的是这个函数的递归形式。如果您能提出一些可行的方法,我将不胜感激!

【问题讨论】:

  • 12 本身不是最大除数吗?
  • 我看不出递归在这里有什么帮助。除数的最大除数总是小于所述除数。您还可以将迭代的起点更改为floor(n/2),因为n 永远不能被大于n/2 的任何值除。

标签: python recursion iteration


【解决方案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)

【讨论】:

    【解决方案2】:

    一般来说,如果您首先找到最小除数(大于 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)
    

    【讨论】:

    • 我正在考虑改进我的答案,但您的答案已经包含我想要添加的内容...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 2011-09-18
    • 2017-07-07
    • 2011-02-27
    • 1970-01-01
    相关资源
    最近更新 更多