递归实现factorial函数疑问:else分支j值为何成为乘数?
关于Python递归阶乘函数中else分支影响结果的疑问
我在使用Python递归实现factorial(阶乘)函数时遇到了困惑。
原代码如下:
def factorial(i): if(i): j = i * factorial(i-1) else: j = 1 return j
运行结果:factorial(0)返回1,factorial(3)返回6。
当我将else分支的j = 1改为j = 2后,代码变为:
def factorial(i): if(i): j = i * factorial(i-1) else: j = 2 return j
此时运行结果为:factorial(0)返回2,factorial(3)返回12,factorial(4)返回48。
请问为何else分支中j的值会成为乘数,进而影响最终的计算结果?
解答
这是因为else分支是递归的终止条件,它返回的值是整个递归乘法链的基准起始值。
递归计算阶乘的逻辑是层层拆解:计算factorial(n)时,会先去计算factorial(n-1),直到触发终止条件(i=0时进入else分支)。此时返回的数值会作为最内层的乘数,被外层的计算逐步累积相乘。
举个具体例子:
- 原代码中,
factorial(3)的计算链是:3 * factorial(2)→3 * 2 * factorial(1)→3 * 2 * 1 * factorial(0)→3*2*1*1=6 - 修改后,
factorial(3)的计算链变成:3 * factorial(2)→3 * 2 * factorial(1)→3 * 2 * 1 * factorial(0)→3*2*1*2=12
本质上,你把终止条件的返回值从1改成2,相当于给原本的阶乘结果乘了2(因为1和2的倍数差是2),自然会让所有n≥0的factorial(n)结果都变成原来的2倍。
内容的提问来源于stack exchange,提问作者cpio
相关产品推荐
相关产品推荐

