11.3.2 递归定义的组成部分

一个递归函数通常包含一个条件表达式,该表达式有三个部分:

  1. 一个判断函数是否再次调用的真假测试,这里称为再次执行测试
  2. 函数的名称。当调用此名称时,将创建一个函数的新实例,也可以看作是创建一个新的机器人,并告诉它要做什么。
  3. 一个表达式,每次调用函数时都返回不同的值,这里称为下一步表达式。因此,传递给函数的新实例的参数(或参数)将与传递给上一个实例的参数不同。这导致条件表达式,即再次执行测试在正确的重复次数后返回false。

递归函数可能比其他类型的函数简单得多。实际上,当人们首次开始使用它们时,它们经常看起来如此神秘简单,以至于难以理解。就像骑自行车一样,阅读递归函数定义需要一定的技巧,起初很难,但后来似乎很简单。

有几种常见的递归模式。一个非常简单的模式如下:

(defun name-of-recursive-function (argument-list)
  "documentation…"
  (if do-again-test
    body…
    (name-of-recursive-function
         next-step-expression)))

每次评估递归函数时,都会创建它的一个新实例,并告诉它要做什么。参数告诉实例要做什么。

参数被绑定到下一步表达式的值。每个实例以不同的下一步表达式的值运行。

下一步表达式中的值在再次执行测试中使用。

由下一步表达式返回的值被传递给函数的新实例,该实例评估它(或它的某些转化)以确定是否继续还是停止。下一步表达式被设计成当函数不再需要重复时再次执行测试返回false。

再次执行测试有时被称为停止条件,因为它在测试为false时停止重复。