recursion - 从列表中递归获取最小数量

标签 recursion lisp common-lisp

我是 lisp 的新手,正在尝试编写一个从列表中返回最小数字的递归函数。它还想检测原子。以下代码返回错误:

(defun minFromList (l)     
  (cond ((null l) nil) ; Causes error shown below
 ;  (cond ((null l) )   ; Causes the same error 
 ;  (cond ((null l) 0)  ; It causes always 0 to be the final return val.
        ((numberp l) l)
    ((numberp (car l)) (min (car l) (minFromList(cdr l))))
    ((listp (car l)) (min (minFromList (car l)) (minFromList (cdr l))))
    (t nil)       ; if all condition doesn't hold just return nil.
  )
)

错误:

*** - MIN: NIL is not a real number

显然,问题在于当给定列表为空时它返回 nil/0 的位置。有什么可能的解决方法?谢谢。

环境)Ubuntu 11.10,clisp 2.49


更新)虽然我已经拿起this作为答案,如果有其他方法,我欢迎,特别是没有制作新功能(如果有的话)。

这是我根据所选答案制作的最简单的代码。

(defun minNum (a b)
  (cond ((null a) b)
    ((null b) a)
    (t (min a b)))
)

最佳答案

显然,您收到错误消息是因为您尝试将函数的结果用作数字,而当使用空列表作为参数调用函数时,结果为 nil,因此求值尝试使用结果失败。这不是 Common Lisp 问题——你必须决定当参数为空时返回什么。也许 0 是一个很好的值,也许是负无穷大的某种近似值 - 只有您(或使用您的函数的人)才能知道。

至于获取列表的最小值(或总和或任何其他“缩减”),这是 reduce 已经处理的模式Common Lisp 标准函数。所以 min-from-list 看起来像这样:

CL-USER> (defun min-from-list (list &optional (default 0))
           (reduce #'min list :initial-value default))
MIN-FROM-LIST
CL-USER> (min-from-list '(1 2 -3))
-3
CL-USER> (min-from-list '(1 2 -3) -7)
-7
CL-USER> (min-from-list '())
0
CL-USER> (min-from-list '() -3)
-3

(用户可以指定空列表的最小值 - 如果未指定,则为 0)。

关于recursion - 从列表中递归获取最小数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9335426/

相关文章:

lisp - Lisp 中的平方和

javascript - 如何在 JavaScript 中指定最小值和最大值时使用递归创建数组

python - 避免 Python 的栈

python - 如何将字符串处理成子列表层?

LISP SICP 视频讲座 2a 平均潮湿问题

Lisp 函数得到错误数量的参数

sql - 同一张表上的postgres递归查询

user-interface - 找不到 Common Lisp ltk 'button' 类

macros - Lisp 宏的问题

macos - 由于 sdl_delay,lispbuilder-sdl 在 osx 上不工作