尝试定义一个函数,该函数在数字列表中提供最小整数,特别是使用 do 循环(不是 do* 或 dolist 等)



我有一个专门测试我们对do的理解的类作业,要求定义一个函数来生成数字列表的最小值。我们被要求也使用辅助函数("较小"(来执行此操作。

我以前没有编码经验,被迫保持在 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 循环,而且我绝对没有完全理解我已经得到的东西。

提前非常感谢。

Do并行绑定,因此numbers在首次绑定时min不受约束。 您可以通过使用(car lst)而不是在那里(car numbers)来解决此问题。

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

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

只要你使用do*,你仍然可以引用numbers,这是do的顺序绑定变体。然后你必须使用car而不是cadr- 你现在从已经缩小的列表中选择第一个数字。而且你需要修改你的结束条件,以避免用NIL参数调用smaller- 你应该能够轻松解决这个问题。

最新更新