递归实现两数求和匹配函数莫名返回None问题排查
问题出在递归调用的返回值传递上!
嘿,这是递归入门时非常容易踩的坑——你的递归逻辑确实找到了正确的结果,但你没有把这个结果传递回上层调用,导致最终整个函数返回None。
让我拆解一下问题核心:
- 当你的代码在
else分支里调用sum_pairs(ints, s, a, b=b+1)或者sum_pairs(ints, s, a=a+1, b=a+2)时,你只是执行了递归函数,但没有把它的返回值return出去。 - 举个例子:假设递归到某一层找到了符合条件的
[x,y]并返回了这个列表,但它的上层调用只是触发了递归,没有把这个结果继续返回给更上层,直到最外层函数,因为没有遇到有效的return语句,就默认返回了None。
修正后的代码
你只需要在递归调用的地方加上return,把下层的结果传递回来即可:
def sum_pairs(ints, s, a=0, b=1): if a == len(ints)-1 or b > 666: return None if b < len(ints): print(s, a,b,[ints[a],ints[b]], ints[a] + ints[b]) if ints[a] + ints[b] == s: x = ints[a] y = ints[b] print([x,y], type([x,y]), [x,y] is None) return [x, y] else: # 加上return,把递归结果传递回上层 return sum_pairs(ints, s, a, b=b+1) else: # 同样加上return,传递递归结果 return sum_pairs(ints, s, a=a+1, b=a+2)
为什么这样改有效?
每一层递归调用的结果都需要被上层接收并返回,这样当最底层的递归找到正确的列表时,这个结果会沿着调用链一步步传回最外层函数,最终返回给调用者,而不会丢失在递归层级里。
你之前的测试里看到[x,y] is None是False,说明那一层确实生成了正确的列表,但因为上层没有return这个递归结果,所以这个列表没有被传递出去,最终最外层函数没有得到有效返回值,就返回了默认的None。
内容的提问来源于stack exchange,提问作者Aaron Bergfeld
相关产品推荐
相关产品推荐

