Lisp 试图定义一个函数,该函数专门使用do循环(非do*或dolist等)在数字列表中提供最小整数

Lisp 试图定义一个函数,该函数专门使用do循环(非do*或dolist等)在数字列表中提供最小整数,lisp,common-lisp,do-loops,Lisp,Common Lisp,Do Loops,我有一个课堂作业,专门测试我们对do的理解,要求定义一个函数来生成一个数字列表的最小值。我们还被要求使用一个辅助函数(“较小”)来实现这一点 我没有以前的编码经验,被迫停留在do的范围内;我一直在尽可能多地阅读这个问题,但我发现的几乎所有东西都建议使用其他方法(do*、COND等) 我将简单的“较小”定义为: 我觉得有一个问题,即“较小”函数不能应用于第一个循环(对此的反馈将非常好),否则我的直接问题是变量“数字”出现错误:“UNBOUND-VARIABLE”。我不确定是哪个“区域”造成了混乱:

我有一个课堂作业,专门测试我们对do的理解,要求定义一个函数来生成一个数字列表的最小值。我们还被要求使用一个辅助函数(“较小”)来实现这一点

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

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

我觉得有一个问题,即“较小”函数不能应用于第一个循环(对此的反馈将非常好),否则我的直接问题是变量“数字”出现错误:“UNBOUND-VARIABLE”。我不确定是哪个“区域”造成了混乱:如果我完全格式化了do循环,或者是第二个/第三个/etc“数字”之一导致了问题

有人能提供一些反馈吗?--再次请记住,我们仅限于简单的do循环,而且我对已经记下的内容肯定没有完全的理解


提前非常感谢。

Do
并行绑定,因此当第一次绑定
min
时,
numbers
不绑定。您可以使用
(car lst)
而不是
(car number)
来解决这个问题

您需要修复结束条件:
(cadr编号)
在上一次迭代中为
nil
,您需要在此之前停止


为了更好的可读性,我建议使用
first
second
而不是
car
cadr

只要使用
do*
,您仍然可以引用
数字,这是
do
的顺序绑定变体。然后你必须使用
car
而不是
cadr
——你现在从已经减少的列表中选择第一个数字。您需要修改结束条件,以避免使用
NIL
参数调用
minger
——您应该能够很容易地解决这个问题。

这个问题已经在这里得到了回答()谢谢!第一部分特别澄清了顺序问题。:)
(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)))