
递归函数必须**每条执行路径都显式返回值**,否则未被 return 覆盖的分支会默认返回 none;本例中递归调用 `add_one(total)` 缺少 return,导致上层调用链丢失返回值。
在 Python 中,函数若未执行任何 return 语句,将隐式返回 None。这一规则对递归函数尤为关键——因为递归本质上是一连串嵌套的函数调用,每一层都必须把自己的结果明确传递给上一层。
来看原始代码的问题所在:
def add_one(num):
if num >= 9:
return num + 1 # ✅ 基础情况:返回 10(当 num==9 时)
total = num + 1
print(total)
add_one(total) # ❌ 缺少 return!该调用虽执行,但结果被丢弃
# 函数至此自然结束 → 隐式返回 None当 add_one(0) 启动后,它一路递归调用 add_one(1)、add_one(2)……直到 add_one(9)。此时 num >= 9 成立,add_one(9) 正确返回 10。但它的直接调用者 add_one(8) 中,这行 add_one(total) 并未加 return,因此 add_one(8) 执行完后什么也不返回 → 返回 None。这个 None 逐层向上传递,最终 mynewtotal 就是 None。
✅ 正确写法是确保所有分支均有明确返回值,尤其是递归调用必须 return:
def add_one(num):
if num >= 9:
return num + 1 # 基础情况:终止递归并返回结果
else:
return add_one(num + 1) # 递归情况:必须 return!把下层结果透传上来
mynewtotal = add_one(0)
print(mynewtotal) # 输出:10? 关键理解:
- add_one(total) 是一个表达式,它有返回值;但如果不写 return add_one(total),就等于“调用了却扔掉了结果”。
- 递归不是“跳转”,而是“委托计算并等待结果”——你必须用 return 把委托的结果交还给调用者。
- 可借助调试器或添加日志验证:在每次调用前后打印 num 和返回值,直观观察传递链是否断裂。
总结:递归函数的每个分支都应以 return 结束(无论是直接值,还是另一个 return func(...)),避免隐式 None 污染返回链。这是递归正确性的基石,而非语法糖或风格偏好。










