2.3.5 函数调用树
为了更好地理解包括多个递归调用的模块化程序(如towersofhanoi.py)的运行过程,我们采用一种称为“函数调用树”的可视化表示方法。特别地,每一个函数调用表示为一个树节点,使用一个圆圈表示,圆圈中标记函数调用的参数的值。在每个树节点的下面,我们画出对应各个函数调用(按从左到右的顺序)的子节点,并使用连线连接树节点和其子节点。函数调用树图中包含了我们理解程序行为所需的所有信息,它包含了每次函数调用的树节点。
我们可以使用函数调用树来理解任何模块化程序的行为。函数调用树特别适用于揭示递归程序的行为。例如,程序towersofhanoi.py中对应于函数调用move()的函数调用树(如图2-3-6所示)很容易被构建。开始绘制一个树节点,标记为从命令行接收的参数。第一个参数为需要移动的圆盘数量(实际上是需要移动的圆盘的标签),第二个参数为移动的方向。为了清晰起见,我们使用左箭头(←)或右箭头(→)表述圆盘移动的方向(一个布尔值,值为True则左移,值为Flase则右移)。然后在该树节点的下面绘制两个子树节点,子节点的圆盘数量递减1,移动的方向左右切换。重复上述过程,直至所有树节点的第一个参数值为1,且没有子树节点。这些树节点对应于没有进一步递归调用的move()调用。
程序2.3.2 汉诺塔问题(towersofhanoi.py)
程序2.3.2输出汉诺塔问题的移动指令。递归函数move()输出向左移动n个圆盘需要的移动指令(如果left为True)或向右移动n个圆盘的指令(如果left为False)。程序2.3.2的运行过程和结果如下: ...
Get 程序设计导论:Python语言实践 now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.