lisp - 尝试定义一个函数,该函数在数字列表中提供最小整数,具体使用 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 循环,而且我绝对没有完全理解我已经掌握的内容。
提前非常感谢。
解决方案
Do
并行绑定,所以第一次绑定numbers
时不min
绑定。你可以通过使用(car lst)
而不是(car numbers)
那里来解决这个问题。
然后您需要修复结束条件:(cadr numbers)
在nil
最后一次迭代中,您需要在此之前停止。
为了更好的可读性,我建议在这里使用first
andsecond
而不是car
and cadr
。
推荐阅读
- python - Python 请求 - BadStatusLine('Content-type: text/html\r\n')
- c++ - 推演指南和特化找出是否指定了模板参数:不工作
- java - 我如何让 opensearch 服务器在 linux 上使用 ssl https
- ios - 我可以使用单个 Cocoapod 定位多个 Xcode/Swift 版本吗?
- c++ - 从类指针到 int 的无效转换
- mongodb - 在 spark + hdfs + mongo 环境中实现单元测试
- fpm - PHP-FPM 无法关闭
- log4j2 - How to set log4j2.json configuration.properties.property default value
- c++ - 如何读取 google::protobuf::io::CodedOutputStream::WriteVarint32ToArray 写入的数据
- scala - 如何从列表中创建火花数据框