Python函数返回值疑问:递归求GCD的else分支为何必须返回函数?
关于递归GCD函数中返回调用的疑问解答
嘿,这个问题戳中了递归里最容易踩的坑之一——递归调用的返回值传递,我来给你掰扯清楚:
首先,咱们先看你写的代码问题出在哪:
def gcd_a(a,b): if a==0: return b else: gcd_a(b%a,a) # 这里没有return!
为什么必须返回函数调用?
递归的本质是多层函数调用嵌套,每一次gcd_a调用都是一个独立的执行上下文。当你在else分支里只调用gcd_a(b%a,a)而不返回它时,这一层函数执行完这个调用后,就没有任何值返回给它的上层调用了(Python里函数没写return的话默认返回None)。
举个实际的例子,比如你调用gcd_a(12,8):
- 第一层
gcd_a(12,8):a≠0,调用gcd_a(8,12),但不返回,所以这层最终返回None - 第二层
gcd_a(8,12):a≠0,调用gcd_a(4,8),不返回,返回None - 第三层
gcd_a(4,8):a≠0,调用gcd_a(0,4),不返回,返回None - 第四层
gcd_a(0,4):触发if条件,返回4——但这个4只能回到第三层的调用里,可第三层没有把它返回,所以第三层还是给第二层返回None,以此类推,最终你拿到的结果是None,而不是正确的最大公约数4。
只有让每一层递归都把下层调用的结果返回给上层,才能把最底层得到的b值一路传递回最初的调用处。所以else分支必须写成:
return gcd_a(b%a,a)
能不能直接调用函数,只靠底层返回b?
答案是不行。因为直接调用的话,底层返回的b只会停留在它的上一层调用里,没法继续往上传递。你需要每一层都“接力”把结果传回去,否则最初的调用根本拿不到这个值,最终得到的还是None。
修正后的完整代码应该是这样:
def gcd_a(a,b): if a == 0: return b else: return gcd_a(b % a, a)
再走一遍正确的流程:
gcd_a(12,8)→ returngcd_a(8,12)gcd_a(8,12)→ returngcd_a(4,8)gcd_a(4,8)→ returngcd_a(0,4)gcd_a(0,4)→ return 4- 这个4被传回给
gcd_a(4,8),它再把4传回给gcd_a(8,12),最终gcd_a(12,8)拿到4并返回给你——这才是正确的结果。
内容的提问来源于stack exchange,提问作者Himanshu Jotwani
相关产品推荐
相关产品推荐

