参数为 3 或 4

假设调用 triangle-recursively 时参数为 3。

Step 1   执行再次执行条件

首先执行 if 表达式。 这是再次执行条件,返回假, 因此执行 if 的 else 部分。 (注意在本例中,再次执行条件在为假时才会递归调用, 而不是为真时。)

Step 2   执行 else 部分的最内层表达式

执行 else 部分最内层表达式,将 3 减为 2。 这是步进表达式。

Step 3   执行 triangle-recursively 函数

数字 2 被传给 triangle-recursively 函数。

我们已经知道参数为 2 时 triangle-recursively 的执行结果, 按照前面的步骤执行后会返回 3。 这里也会得到同样结果。

Step 4   执行加法

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 中讨论。