You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何递归调用前缺return的欧几里得算法代码陷入死循环?

递归欧几里得算法陷入无限循环的原因分析

你代码的核心问题不是只缺return,而是同时混用了递归和while循环,这直接导致了无限执行。结合你观察到的流程,拆解下具体执行过程:

  1. 当调用Euclid(6,12)时,因为a和b都不为0,进入while循环。由于6<12,执行Euclid(6, 12%6)也就是Euclid(6,0)。
  2. 进入Euclid(6,0)后,不满足while not (a ==0 or b ==0)的条件(因为b是0),直接执行return max(6,0)=6,这个返回值回到了Euclid(6,12)的递归调用位置。
  3. 但你在递归调用前没写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:31:18