我们从三个变量开始:三角形的总行数、
某一行的石子数,以及我们想要计算的
石子总数。这些变量可以分别命名为
number-of-rows、number-of-pebbles-in-row
和 total。
total 和 number-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)