我有一个专门测试我们对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
,则需要在此之前停止。
为了更好的可读性,我建议在这里使用first
和second
而不是car
和cadr
。
只要你使用do*
,你仍然可以引用numbers
,这是do
的顺序绑定变体。然后你必须使用car
而不是cadr
- 你现在从已经缩小的列表中选择第一个数字。而且你需要修改你的结束条件,以避免用NIL
参数调用smaller
- 你应该能够轻松解决这个问题。