首页 > 解决方案 > 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 条件。为什么呢?

标签: common-lisp

解决方案


天哪,我觉得自己很愚蠢。

(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)

我猜是递归模因的牺牲品。


推荐阅读