最大递归,GCD(最大公约数)

时间:2014-03-20 13:41:14

标签: python recursion

我写了一个程序来使用python找到gcd。

def gcd(a,b):
    r=a%b
    if r==0:
        return a
    elif r==1:
        return 1
    else:
        gcd(a,b)==gcd(b,r)
        return gcd(b,r)

每当我调用该函数时,它都会显示消息“超出最大递归次数”。请帮忙 我知道可以使用循环来完成,但我想通过使用递归方法来专门完成它。并忍受我。我是学习者!

5 个答案:

答案 0 :(得分:3)

这个陈述是不必要的,它是使递归无止境的那个:gcd(a,b)==gcd(b,r)因为它一次又一次地调用gcd(a,b)。只需删除它:

def gcd(a,b):
    r=a%b
    if r==0:
        return a
    elif r==1:
        return 1
    return gcd(b,r)

注意:顺便说一句,你得到的公式有误,你应该在if子句上返回b,因为你在计算模数时要分a/b

def gcd(a,b):
    r=a%b
    if r==0:
        return b
    elif r==1:
        return 1
    return gcd(b,r)

>>>gcd(10,4)
2

答案 1 :(得分:1)

gcd(a,b)==gcd(b,r)并没有按照您的预期行事。

它并不意味着定义gcd(a,b)等于gcd(b,r)"。

相反,gcd(a,b)==gcd(b,r)表示:

  • 计算gcd(a,b)
  • 计算gcd(b,r)
  • 比较两个结果,看看它们是否相等。

由于您要求计算gcd(a, b)以便计算gcd(a, b),因此您将获得无休止的递归。

相反,您需要return gcd(b, r)。即:

def gcd(a,b):
    r=a%b
    if r==0:
        return a
    elif r==1:
        return 1
    else:
        return gcd(b,r)

答案 2 :(得分:1)

如果您正在尝试计算非常大数的GCD(例如,在搜索common factors in RSA moduli时),那么最好完全避免递归并使用迭代函数。例如:

def gcd(a,b):
    while a:
        a,b = b%a,a
    return b

答案 3 :(得分:0)

我就这样做了

    def gcd(m,n):
      if m >= n:
      r = m % n
        if r == 0:
         return n
        else:
          m = n
          n = r
          return gcd(m,n)
      else:
        temp = m
        m = n
        n = temp
        return gcd(m,n)

答案 4 :(得分:0)

def gcd(a,b):
    if a % b == 0:
       return b
    return gcd(b, a % b)