Python使用递归函数时最后输出None而非hello的原因是什么?
递归函数返回None问题原因解析
问题根因
- 核心问题是你的
hello函数在n≠1的分支中没有显式指定返回值,Python中所有函数如果没有手动写return语句声明返回值,默认都会返回None。
完整执行流程拆解
你调用hello(5)的完整执行链路如下:
- n=5≠1,执行
print('hello')(输出第一个hello),调用hello(4),当前分支无return,后续将默认返回None - n=4≠1,执行
print('hello')(输出第二个hello),调用hello(3),当前分支无return,后续将默认返回None - n=3≠1,执行
print('hello')(输出第三个hello),调用hello(2),当前分支无return,后续将默认返回None - n=2≠1,执行
print('hello')(输出第四个hello),调用hello(1),当前分支无return,后续将默认返回None - n=1,触发终止条件
return 'hello',这个字符串只会返回给上一层hello(2)的调用位置,不会自动向上传递
因为从hello(2)到hello(5)的所有外层调用都没有把递归调用的结果return出去,所以最外层hello(5)的最终返回值就是Python默认的None,你最后执行print(hello(5))自然就会把这个None打印出来。
修复方案
如果要达到预期打印5个hello的效果,可任选一种修改方式:
- 方案1:给递归调用增加return,让终止条件的返回值一路传递到最外层
def hello(n): if n == 1: return 'hello' else: print('hello') return hello(n-1) # 新增return传递递归结果
修改后hello(5)会返回'hello',print(hello(5))就会打印出第五个hello,不会再出现None。
- 方案2:直接在函数内打印所有hello,不需要额外print调用结果
def hello(n): print('hello') if n == 1: return hello(n-1) # 直接调用即可,不用嵌套print hello(5)
内容的提问来源于stack exchange,提问作者Hewen Chen
相关产品推荐
相关产品推荐

