为何递归调用前缺return的欧几里得算法代码陷入死循环?
递归欧几里得算法陷入无限循环的原因分析
你代码的核心问题不是只缺return,而是同时混用了递归和while循环,这直接导致了无限执行。结合你观察到的流程,拆解下具体执行过程:
- 当调用
Euclid(6,12)时,因为a和b都不为0,进入while循环。由于6<12,执行Euclid(6, 12%6)也就是Euclid(6,0)。 - 进入
Euclid(6,0)后,不满足while not (a ==0 or b ==0)的条件(因为b是0),直接执行return max(6,0)=6,这个返回值回到了Euclid(6,12)的递归调用位置。 - 但你在递归调用前没写return,所以这个返回值被直接丢弃了——
Euclid(6,12)的程序继续往下走,进入while循环的下一次迭代。此时a还是6,b还是12,和第一次进入循环时完全一样,于是又重复调用Euclid(6,0),返回后又继续循环,无限往复。
你以为函数return后就会退出,但实际上递归的return只会回到上一层调用的位置,而上一层还卡在while循环里——因为循环的条件变量(a和b)根本没被修改,循环永远不会终止。
修正方案
有两种正确的写法,选一种就行:
方案1:纯递归(去掉while循环)
alpha = 546 beta = 66 def Euclid(a, b): if b == 0: return a return Euclid(b, a % b) print(Euclid(alpha, beta))
方案2:纯循环(去掉递归)
alpha = 546 beta = 66 def Euclid(a, b): while b != 0: a, b = b, a % b return a print(Euclid(alpha, beta))
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

