关于计算最大公约数(GCD)的递归代码逻辑的咨询
解析递归实现的最大公约数(GCD)代码
嘿,我来帮你拆解这段求最大公约数的递归代码——它其实是基于经典的欧几里得算法实现的,咱们一步步掰扯清楚:
首先先把完整代码贴出来方便对照:
def hcf(a, b): if(b == 0): return a else: return hcf(b, a % b) # 示例:当a = 60、b = 48时,输出结果为12 # 原测试打印语句:print("The gcd of 60 and 48 is : ", end="") print(hcf(24, 40))
核心逻辑拆解
1. 递归终止条件:if(b == 0): return a
这是整个递归的"终点"。咱们得先理解:任何数和0的最大公约数都是这个数本身。比如gcd(12, 0)的结果就是12,因为12能整除自己,0也能被12整除(0除以任何非零数都是0)。所以当b变成0时,当前的a就是我们要找的最大公约数。
2. 递归调用:return hcf(b, a % b)
这一步是欧几里得算法的核心:两个数的最大公约数,等于较小数和较大数除以较小数的余数的最大公约数,写成公式就是 gcd(a, b) = gcd(b, a mod b)。
a % b 是Python里取余数的运算符,比如60除以48的余数是12,48除以12的余数是0。
拿示例走一遍流程
咱们用你代码里的hcf(24, 40)来一步步追踪:
- 第一次调用:
hcf(24, 40)→ b≠0,调用hcf(40, 24%40)→ 24%40=24,所以变成hcf(40,24) - 第二次调用:
hcf(40,24)→ b≠0,调用hcf(24,40%24)→ 40%24=16,变成hcf(24,16) - 第三次调用:
hcf(24,16)→ b≠0,调用hcf(16,24%16)→24%16=8,变成hcf(16,8) - 第四次调用:
hcf(16,8)→ b≠0,调用hcf(8,16%8)→16%8=0,变成hcf(8,0) - 第五次调用:
hcf(8,0)→ b=0,返回8,这就是最终的最大公约数。
再验证你给的60和48的例子:hcf(60,48) → hcf(48,12) → hcf(12,0) → 返回12,完全符合预期。
说白了,这个递归就是不断把问题"缩小",直到碰到终止条件,然后逐层返回结果,最终得到两个数的最大公约数。
内容的提问来源于stack exchange,提问作者Sahil Ghate




