You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:42:50