Python递归函数返回参数的作用:修改返回值为何结果差异显著?
递归函数返回值差异的底层原因分析
一、返回result版本的执行逻辑
这个版本的递归核心是每一层调用都会把自身的k和下一层调用的返回值累加,最终返回这个累加结果,完全符合三角序列的计算逻辑。
以fib(6)为例,调用栈的执行顺序是:
- 从
fib(6)开始,因为k>0,先调用fib(5),当前逻辑暂停 - 依次递归到
fib(4)、fib(3)、fib(2)、fib(1),直到fib(0) fib(0)进入else分支打印空行,返回初始的result=0- 开始回溯:
fib(1)计算result=1 + fib(0)=1+0=1,打印对应内容后返回1fib(2)计算result=2 + fib(1)=2+1=3,打印后返回3- 以此类推,每一层的
result都是当前k加上上一层的返回值,最终得到三角序列的打印结果:1、3、6、10、15、21
二、返回k版本的执行逻辑
这个版本的关键变化是每一层递归最终返回的是当前的k值,而非累加后的result,直接改变了result的计算逻辑:
同样以fib(6)为例:
- 递归调用到
fib(0)时,返回的是k=0 - 回溯阶段:
fib(1)计算result=1 + fib(0)=1+0=1,打印后返回自身的k=1fib(2)计算result=2 + fib(1)=2+1=3,打印后返回自身的k=2fib(3)计算result=3 + fib(2)=3+2=5,打印后返回自身的k=3- 后续
fib(4)到fib(6)的result依次为4+3=7、5+4=9、6+5=11,各自打印后返回对应的k值
- 所以打印结果变成了1、3、5、7、9、11
三、关于最终返回值的疑问
你疑惑“为何最终返回的不是k的1、2、3、4、5、6这些值”,原因很明确:
- 递归的每一层调用都是独立的执行上下文,每一层的返回值只会被上一层调用用来计算临时的
result,不会直接成为整个fib(6)调用的结果。 - 只有最外层的
fib(6)调用的返回值,才是整个函数调用的最终结果——也就是它自身的k=6。中间fib(1)到fib(5)的返回值,只是上层计算的临时数据,不会被直接输出或作为最终返回值。
内容的提问来源于stack exchange,提问作者JonP
相关产品推荐
相关产品推荐

