我写了一个程序来使用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)
每当我调用该函数时,它都会显示消息“超出最大递归次数”。请帮忙 我知道可以使用循环来完成,但我想通过使用递归方法来专门完成它。并忍受我。我是学习者!
答案 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)