Lisp 试图定义一个函数,该函数专门使用do循环(非do*或dolist等)在数字列表中提供最小整数
我有一个课堂作业,专门测试我们对do的理解,要求定义一个函数来生成一个数字列表的最小值。我们还被要求使用一个辅助函数(“较小”)来实现这一点 我没有以前的编码经验,被迫停留在do的范围内;我一直在尽可能多地阅读这个问题,但我发现的几乎所有东西都建议使用其他方法(do*、COND等) 我将简单的“较小”定义为: 我觉得有一个问题,即“较小”函数不能应用于第一个循环(对此的反馈将非常好),否则我的直接问题是变量“数字”出现错误:“UNBOUND-VARIABLE”。我不确定是哪个“区域”造成了混乱:如果我完全格式化了do循环,或者是第二个/第三个/etc“数字”之一导致了问题 有人能提供一些反馈吗?--再次请记住,我们仅限于简单的do循环,而且我对已经记下的内容肯定没有完全的理解Lisp 试图定义一个函数,该函数专门使用do循环(非do*或dolist等)在数字列表中提供最小整数,lisp,common-lisp,do-loops,Lisp,Common Lisp,Do Loops,我有一个课堂作业,专门测试我们对do的理解,要求定义一个函数来生成一个数字列表的最小值。我们还被要求使用一个辅助函数(“较小”)来实现这一点 我没有以前的编码经验,被迫停留在do的范围内;我一直在尽可能多地阅读这个问题,但我发现的几乎所有东西都建议使用其他方法(do*、COND等) 我将简单的“较小”定义为: 我觉得有一个问题,即“较小”函数不能应用于第一个循环(对此的反馈将非常好),否则我的直接问题是变量“数字”出现错误:“UNBOUND-VARIABLE”。我不确定是哪个“区域”造成了混乱:
提前非常感谢。
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)))