首页 > 解决方案 > 在 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。

标签: lisp

解决方案


如果你在 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。这些表达式是如此之小,许多程序员会避免编写函数而直接使用它们。

关于递归,你不会在生产代码中使用递归来解决这个问题,只是作为学习递归的家庭作业。


推荐阅读