common-lisp - GISC 练习 8.24 和 8.26:cond 结果形式的 if 条件未按预期工作
问题描述
David Touretzky 的“A Gentle Introduction to Symbolic Computation”的练习 8.24 和 8.26 状态:
8.24:编写 COUNT-DOWN,一个使用 list-consing 递归从 n 开始倒数的函数。(count 5) 应该产生列表 (5 4 3 2 1)。
8.26:假设我们想修改 COUNT-DOWN 使其构造的列表以零结尾。例如,(COUNT-DOWN 5) 将产生 (5 4 3 2 1 0)。[...]
所以我尝试将这两个练习组合成一个countdown
带有关键字参数的函数incl-zero
,如下所示:
(defun countdown (n &key (incl-zero nil))
(cond
((zerop n) (if incl-zero '(0) nil))
(t (cons n (countdown (1- n))))))
(countdown 5)
(countdown 5 :incl-zero t)
然而,这两个倒计时的调用都返回(5 4 3 2 1)
,所以似乎:incl-zero t
没有达到 if 条件。为什么呢?
解决方案
天哪,我觉得自己很愚蠢。
(defun countdown (n &key (incl-zero nil))
(cond
((zerop n) (if incl-zero '(0) nil))
(t (cons n (countdown (1- n) :incl-zero incl-zero)))))
(countdown 5)
(countdown 5 :incl-zero t)
我猜是递归模因的牺牲品。
推荐阅读
- loops - TestCafe 循环遍历元素并检查 Set 中是否存在类
- javascript - 为什么当我更新商品数量时,循环遍历购物车商品并返回商品数量的 Vuex getter 不更新?
- python - 使用布尔数组的逐项总和作为包含的“或”
- git - GIT:获取未合并文件的哈希
- webpack - CleanWebpackPlugin 在 Webpack 5 中无法清理
- wordpress - 在 WooCommerce REST API 上按 menu_order 订购产品和类别
- testing - TestCafe EC2 网络日志
- python - 将两个数据框绘制成一个条形图,区分它们的值
- javascript - (已解决)React/JS 如何获取 props.data 的最后一个索引的值,它是一个对象
- css - 如何连续运行两个关键帧的CSS动画