
递归函数必须每一路径都显式返回值,否则未加 return 的递归调用会默认返回 none,导致整个调用链末端丢失结果。
在你的代码中,add_one 函数看似在 num >= 9 时正确返回了 num + 1(即 10),但问题出在递归分支未返回值:
def add_one(num):
if num >= 9:
return num + 1 # ✅ 基础情况:返回 10
total = num + 1
print(total)
add_one(total) # ❌ 缺少 return!这行只是调用,不传递返回值当 num 为 0 时,函数逐层调用 add_one(1) → add_one(2) → … → add_one(9)。前 9 次调用均执行到末尾而没有 return 语句,因此 Python 默认返回 None(这是所有无返回值函数的隐式行为)。只有最深层的 add_one(9) 返回了 10,但它被上一层(add_one(8))忽略——因为 add_one(8) 调用了 add_one(9) 却没用 return 把结果“托上去”。
✅ 正确写法是:所有分支(包括递归分支)都必须有 return:
def add_one(num):
if num >= 9:
return num + 1 # 基础情况:返回 10
else:
return add_one(num + 1) # 递归情况:把子调用的结果原样返回这样,add_one(8) 会 return add_one(9),而 add_one(9) 返回 10,于是 10 逐层向上传递,最终 mynewtotal 得到 10。
⚠️ 注意事项:
- 递归不是“自动接力”,而是手动传递返回值的过程;
- 忘记 return 递归调用是新手最常见错误,会导致 None 污染结果;
- 可借助调试器或添加 print(f"→ {num} returns {result}") 辅助追踪返回流。
总结:if 语句本身不控制递归终止逻辑,它只定义基础情况;真正决定“值能否抵达顶层”的,是每层是否用 return 主动转发结果。










