首页 > 解决方案 > 尝试定义一个函数,该函数在数字列表中提供最小整数,具体使用 do 循环(不是 do* 或 dolist 等)

问题描述

我有一个专门测试我们对 do 理解的类的作业,要求定义一个函数来生成一个数字列表中的最小值。我们还被要求使用辅助功能(“更小”)来这样做。

我以前没有编码经验,并且被迫停留在做的范围内;我一直在尽可能多地阅读这个问题,但我发现的几乎所有内容都只是建议使用其他方法(do*、COND 等)。

我将一个简单的“较小”定义为:

(defun smaller (x y)
  (if (< x y) x y))

然后我这样处理问题:

(defun minimum (lst)
  "(lst)
Returns the minimum of a list of numbers."
  (do ((numbers lst (cdr numbers))
       (min (car numbers) (smaller min (cadr numbers))))
      ((null numbers) min)))

我觉得有一个问题是“较小的”函数不能应用于第一个循环(关于这个的反馈会很好),否则我的直接问题是得到一个错误:变量“NUMBERS”的“UNBOUND-VARIABLE” . 我不确定哪个“区域”导致了混乱:如果我完全格式化了 do 循环,或者第二个/第三个/等等之一。“数字”引起了问题。

有人可以提供一些反馈吗?-- 再次记住,我们仅限于简单的 do 循环,而且我绝对没有完全理解我已经掌握的内容。

提前非常感谢。

标签: lispcommon-lispdo-loops

解决方案


Do并行绑定,所以第一次绑定numbers时不min绑定。你可以通过使用(car lst)而不是(car numbers)那里来解决这个问题。

然后您需要修复结束条件:(cadr numbers)nil最后一次迭代中,您需要在此之前停止。

为了更好的可读性,我建议在这里使用firstandsecond而不是carand cadr


推荐阅读