有时把运行中的程序想象成执行任务的机器人会有助于理解。 在执行任务时,递归函数会请第二个机器人帮忙。 第二个机器人与第一个完全一样, 只是它在协助第一个机器人,并且接收的参数不同。
在递归函数中,第二个机器人可能会调用第三个, 第三个又可能调用第四个,依此类推。 每个都是不同的实体,但全是克隆体。
由于每个机器人的指令略有不同 — 参数各不相同 — 最后一个机器人应当知道何时停止。
我们来扩展 “计算机程序就是机器人” 这个比喻。
函数定义为机器人提供了蓝图。
当你安装函数定义时,也就是执行 defun 宏时,
你就装配好了制造机器人所需的设备。
这就像你在工厂里搭建一条流水线。
同名机器人按照相同蓝图制造,
因此型号相同,但序列号不同。
我们常说递归函数 “调用自身(calls itself)”。 我们的意思是,递归函数中的指令 会让 Lisp 解释器运行另一个同名、任务相同、 但参数不同的函数。
各个实例的参数必须不同,这一点很重要; 否则过程永远不会停止。