递归函数draw中print语句执行时机及原理咨询
递归代码执行流程解析
你的代码里的print('#'*n)不是等所有递归调用完成后才执行,而是在每一层递归的子调用全部执行完毕后,才轮到当前层的print语句执行。
具体执行步骤拆解:
- 启动调用
draw(3):先执行draw(2),当前层的print('#'*3)暂时被挂起,不执行 - 进入
draw(2):先执行draw(1),当前层的print('#'*2)挂起 - 进入
draw(1):先执行draw(0),当前层的print('#'*1)挂起 - 进入
draw(0):先执行draw(-1) - 进入
draw(-1):触发n<0的条件,直接return,回到draw(0)的上下文 draw(0)的子调用执行完毕,执行print('#'*0)——输出空字符串(也就是空行)draw(0)执行完,回到draw(1)的上下文draw(1)的子调用执行完毕,执行print('#'*1)——输出#draw(1)执行完,回到draw(2)的上下文draw(2)的子调用执行完毕,执行print('#'*2)——输出##draw(2)执行完,回到draw(3)的上下文draw(3)的子调用执行完毕,执行print('#'*3)——输出###
关于'#'*n的存储与输出机制:
'#'*n是Python的字符串重复语法,执行时会立即生成对应长度的字符串(比如n=3时直接生成'###'),这个字符串是临时对象,生成后直接传递给print()函数,打印到控制台后,就会被Python的垃圾回收机制清理,不会长期占用内存存储。- 它的生成和打印完全依赖当前层递归的执行时机:只有当当前层的所有子递归调用都执行完毕并返回后,才会触发这个字符串的生成和打印操作。
内容的提问来源于stack exchange,提问作者jack_
相关产品推荐
相关产品推荐

