【问题标题】:Common Lisp - SLIME in infinte loopCommon Lisp - 无限循环中的 SLIME
【发布时间】: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


    【解决方案1】:

    好吧,没关系,不够仔细。代码尝试评估 fib 0,但无法满足 do 中的测试条件。这就是它无限运行的原因

    由(fib (+ k 1))修复它

    【讨论】:

    • 要么确保 fib 永远不会在输入零(硬)的情况下被调用,要么使 fib 对无效输入具有鲁棒性。您可以有一个辅助递归函数 fib% 不检查输入并从调用 check-type 的安全 fib 函数调用它
    猜你喜欢
    • 2013-06-27
    • 2013-05-16
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2011-08-24
    • 2018-09-23
    相关资源
    最近更新 更多