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

Python 最大递归,GCD(最大公约数),python,recursion,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) 无论何时调用该函数,它都会显示消息“已超过最大递归”。请帮助 我知道可以使用循环来完成,但我想特别使用递归方法。请容忍我。我是一个学习者 这个语句是不必要的,它

我用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)
无论何时调用该函数,它都会显示消息“已超过最大递归”。请帮助
我知道可以使用循环来完成,但我想特别使用递归方法。请容忍我。我是一个学习者

这个语句是不必要的,它使递归无止境:
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

这个语句是不必要的,它使递归无止境:
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
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)
,因此您将得到一个无休止的递归

相反,您希望
在该点返回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)
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)
,因此您将得到一个无休止的递归

相反,您希望
在该点返回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)
我就是这样做的

    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)
我就是这样做的

    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)

如果您试图计算非常大的数字的GCD(例如,在搜索时),您最好完全避免递归,而是使用迭代函数。例如:

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

如果您试图计算非常大的数字的GCD(例如,在搜索时),您最好完全避免递归,而是使用迭代函数。例如:

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

你为什么要检查等式?gcd(a,b)==gcd(b,r)应该做什么?除了递归修复,我认为你在公式上有错误,检查我的答案。你为什么要检查等式?gcd(a,b)==gcd(b,r)应该做什么?除了递归修复,我认为你在公式上有错误,请核对我的答案