lisp - 在 lisp 中查找最大值
问题描述
我正在尝试使用递归方法来查找列表中的最大值。任何人都可以解释我在此代码上犯的错误以及下次如何处理它。
(defun f3 (i)
(setq x (cond (> (car (I)) (cdr (car (I))))
(f3 (cdr (I)))))
)
(f3 '(33 11 44 2) )
我也尝试了以下方法但没有奏效:
(defun f3 (i)
(cond ((null I )nil )
(setq x (car (i))
(f3(cdr (i)))
(return-from max x)
)
非常感谢您的帮助。如果有帮助,我来自java。
解决方案
如果你在 Common Lisp 中工作,那么你可以这样做:
(defun max-item (list)
(loop for item in list
maximizing item))
而已。maximizing item
子句loop
确定看到的最高值,并隐含地将其确定为它终止时item
的结果值。loop
请注意,如果list
为空,则返回nil
. 如果你想要一些其他的行为,你必须在:
(if list
(loop for item in list
maximizing item))
(... handle empty here ...))
如果已知列表中的元素数量很少,低于 Lisp 实现对可以传递给函数的参数数量的限制,您可以简单地将列表应用于max
函数:
(defun max-item (list)
(apply #'max list))
如果list
为空,则max
误用:它需要一个或多个参数。可能会发出错误情况的信号。如果这在您的情况下不起作用,您需要添加代码以提供所需的行为。
如果预计列表很大,因此要避免这种方法,您可以使用reduce
, 将max
其视为二元函数:
(defun max-item (list)
(reduce #'max list))
关于 empty 的相同评论list
。这些表达式是如此之小,许多程序员会避免编写函数而直接使用它们。
关于递归,你不会在生产代码中使用递归来解决这个问题,只是作为学习递归的家庭作业。
推荐阅读
- react-native - React Native:错误:捆绑失败:index.js:“”不是有效的标识符名称
- angularjs - 从Angularjs中的数组中获取特定元素
- c# - 外键关系没有出现在 edmx 与 mysql 数据库与 asp mvc 与数据库第一
- angularjs - 在ajax formdata中获取415(不支持的媒体类型)发布到spring
- flutter - 如何在颤动中从 SelectableText 小部件中获取选定的文本
- json - 使用 Spark 2.4 识别空 JSON 文件
- c# - 在 Unity 中捕获 360 度屏幕截图会忽略 UI 层
- sql - 如何将一个 SQL 列转换为同一行的多个列?
- java - 在 Android 中,我如何实现一个全局触摸跟踪服务,即使屏幕上正在运行其他应用程序也能正常工作
- java - Spring Boot 配置问题中的 JWT 令牌