假设调用 triangle-recursively 时参数为 3。
首先执行 if 表达式。
这是再次执行条件,返回假,
因此执行 if 的 else 部分。
(注意在本例中,再次执行条件在为假时才会递归调用,
而不是为真时。)
执行 else 部分最内层表达式,将 3 减为 2。 这是步进表达式。
triangle-recursively 函数数字 2 被传给 triangle-recursively 函数。
我们已经知道参数为 2 时 triangle-recursively 的执行结果,
按照前面的步骤执行后会返回 3。
这里也会得到同样结果。
3 作为参数参与加法, 与函数调用时的参数 3 相加。
函数整体返回值为 6。
既然我们知道参数为 3 时的结果, 那么参数为 4 时的情况也就显而易见:
在递归调用中,执行
(triangle-recursively (1- 4))会得到执行
(triangle-recursively 3)的结果,即 6, 该值会与第三行的加法表达式中的 4 相加。
函数整体返回值为 10。
每次 triangle-recursively 被执行时,
都会以更小的参数执行自身的另一个版本 — 另一个实例 —
直到参数小到不再递归为止。
注意,这种递归设计需要推迟操作执行。
(triangle-recursively 7) 要算出结果,
必须先调用 (triangle-recursively 6);
而 (triangle-recursively 6) 要算出结果,
必须先调用 (triangle-recursively 5),依此类推。
也就是说,(triangle-recursively 7) 的计算
必须推迟到 (triangle-recursively 6) 计算完成;
而 (triangle-recursively 6) 又要推迟到
(triangle-recursively 5) 完成,依此类推。
如果把每个 triangle-recursively 实例
想象成不同的机器人,
第一个机器人必须等待第二个完成任务,
第二个又要等第三个,依此类推。
有一种方法可以避免这种等待, 我们将在 Recursion without Deferments 中讨论。