【发布时间】:2021-09-12 22:57:43
【问题描述】:
几天前我开始学习Common Lisp,阅读Peter Seibel的书。我已经下载了适用于 Windows 的 lispbox-0.7 并尝试了 SLIME REPL 中的一些概念。
现在我在第 7 章。宏和标准控制结构/循环,我发现第 11 个斐波那契数的 do 表达式很有趣
(do ((n 0 (1+ n))
(cur 0 next)
(next 1 (+ cur next)))
((= 10 n) cur))
我定义了以下函数
(defun fib (n) (do ((i 1 (1+ i)) (cur 0 next) (next 1 (+ cur next))) ((= n i) cur)))
该函数执行我的预期并返回第 n 个斐波那契数。现在出于好奇,我尝试使用 dotimes 循环对前 10 个斐波那契数进行求和
(let ((sum 0)) (dotimes (k 10) (setf sum (+ sum (fib k)))) sum)
但是这个表达式运行不确定,我不明白为什么。也许这是另一个我不知道的概念。我尝试了一个更简单的例子,比如
(dotimes (k 10) (fib k))
应该返回NIL。但这也无限期地运行。有人可以向我解释我缺少什么吗?
谢谢
【问题讨论】:
标签: lisp infinite-loop fibonacci do-loops