Python阶乘递归函数可打印y却无法正常返回y的原因
问题根本原因
你的递归函数在else分支没有写return语句,导致递归深层的返回值没有逐层向外传递,外层调用拿到的是Python函数无显式return时的默认返回值None。
执行流程拆解
顺着调用链可以清晰看到实际运行逻辑:
- 最外层调用
factorial(3),x=3命中else分支:先把全局变量y更新为1*3=3,随后调用factorial(2)。这行代码只是调用了内层递归,没有把内层的返回值继续return出去,等内层调用执行完,这层函数就直接结束,默认返回None。 - 进入
factorial(2),x=2命中else分支:把全局变量y更新为3*2=6,随后调用factorial(1),这一层同样没有写return,等内层执行完默认返回None。 - 进入
factorial(1),x<=1命中if分支:打印当前y的值6,执行return y把6返回给上一层(也就是factorial(2)的调用位置)。 - 但
factorial(2)接收到返回的6之后没有做任何处理,更没有继续向外return,直接结束运行返回None;这个None再传递到最外层的factorial(3)调用处,factorial(3)同样没有return逻辑,最终最外层打印factorial(3)的结果就是None。
为什么hey()能正常返回y
hey()没有递归层级,它是直接读取当前全局作用域下的y值返回。在执行完factorial(3)之后,全局变量y已经被递归过程修改成了6,所以hey()自然能返回6,和递归函数的返回值逻辑完全无关。
修复方法
只需要在else分支的递归调用前加上return,把内层递归的返回值逐层向外传递即可:
y = 1 def factorial(x): global y if x <= 1: print(y) return y else: y = y * x return factorial(x-1) # 补全return,传递内层返回值 def hey(): return y print(factorial(3)) # 输出6 print(hey()) # 输出6
注:实际写阶乘递归不需要依赖全局变量存结果,无副作用的标准写法更简洁也更不容易出错:
def factorial(x): if x <= 1: return 1 return x * factorial(x-1)
内容的提问来源于stack exchange,提问作者paf100
相关产品推荐
相关产品推荐

