函数定义的组成部分

我们从三个变量开始:三角形的总行数、 某一行的石子数,以及我们想要计算的 石子总数。这些变量可以分别命名为 number-of-rowsnumber-of-pebbles-in-rowtotal

totalnumber-of-pebbles-in-row 只在函数内部使用,并用 let 声明。 total 的初始值自然应为 0。 而 number-of-pebbles-in-row 的初始值 应等于三角形的行数,因为加法将从最长的一行开始。

这意味着 let 表达式的开头如下:

(let ((total 0)
      (number-of-pebbles-in-row number-of-rows))
  body...)

石子总数可以通过反复将当前行石子数加到已有总数得到, 即重复执行下面的表达式:

(setq total (+ total number-of-pebbles-in-row))

在将 number-of-pebbles-in-row 加入 total 后, 需要将 number-of-pebbles-in-row 减 1, 因为下一轮循环要将前一行加入总数。

前一行的石子数比当前行少 1, 因此可以使用 Emacs Lisp 内置函数 1- 计算前一行的石子数,表达式如下:

(setq number-of-pebbles-in-row
      (1- number-of-pebbles-in-row))

最后,我们知道当某一行没有石子时, while 循环就应该停止累加。 因此 while 循环的条件很简单:

(while (> number-of-pebbles-in-row 0)