Tree 树中的最小元素

Tree 树中的最小元素,tree,lisp,common-lisp,minimum,Tree,Lisp,Common Lisp,Minimum,我想在Lisp中找到非线性列表(编辑:树)中的最小元素(在任何级别)。我写了这样的东西: (defun minimum (l) (cond ((null l) 99999) ((atom (car l)) (min (minimum (cdr l)) 99999)) ((numberp (car l)) (min (car l) (minimum (cdr l)))) (T (min (minimum (cdr l)) (minimum (Car l)))))

我想在Lisp中找到非线性列表(编辑:树)中的最小元素(在任何级别)。我写了这样的东西:

(defun minimum (l)
  (cond
    ((null l) 99999)
    ((atom (car l)) (min (minimum (cdr l)) 99999))
    ((numberp (car l)) (min (car l) (minimum (cdr l))))
    (T (min (minimum (cdr l)) (minimum (Car l))))))

但是,它不起作用(我想是因为非数值原子的条件…)。有人知道如何修复此代码吗?提前感谢。

您的
numberp
案例永远不会执行,因为
atom
案例首先被测试,而数字就是原子。所以每个数字都被99999所取代。将编号放在第一位

(defun minimum (tree)
    (loop for item in tree
         if (consp item) minimize (minimum item)
         else if (numberp item) minimize item))
代码的另一个问题是,如果树中的最小数大于99999,它将找不到最小数。要在不过度更改代码的情况下修复它,您需要自己版本的
min
,该版本支持无穷大表示:

(defun inf-min (a b)
     (cond ((eq a :infinity) b)
           ((eq b :infinity) a)
           ((< a b) a)
           (t b)))
(解除inf最小值(a b)
(cond((等式a:无穷大)b)
((等式b:无穷大)a)
((

然后,将
min
替换为
inf min
,将99999替换为
:infinity
您的
numberp
案例永远不会执行,因为
atom
案例首先被测试,而数字是原子。所以每个数字都被99999所取代。将编号放在第一位

代码的另一个问题是,如果树中的最小数大于99999,它将找不到最小数。要在不过度更改代码的情况下修复它,您需要自己版本的
min
,该版本支持无穷大表示:

(defun inf-min (a b)
     (cond ((eq a :infinity) b)
           ((eq b :infinity) a)
           ((< a b) a)
           (t b)))
(解除inf最小值(a b)
(cond((等式a:无穷大)b)
((等式b:无穷大)a)
((

然后,将
min
替换为
inf min
,将99999替换为
:infinity

使用99999确实是一种黑客行为(不是一种好的黑客行为),请不要这样做。使用
:infinity
稍微好一点,但是当给出一个空列表时,您是否希望结果是
:infinity
循环
方法更好,但是当列表为空时,最小化返回0,这通常不是我们想要的

最小值函数对于零值是未定义的,因此我将定义一个
tree min
函数,其中当树不包含数字时,结果为
nil
。大概是这样的:

(定义树最小值(树)
(打字机)
带数字的基本情况
(数字树)
字符串也是序列,但不要迭代它们。
(字符串零)
向量和列表
(顺序(减少)(λ(ME)
(let((em(tree mine)))
(或(和m em(min em m));阿姆?
em)))
树
:初始值(零)
该函数以静默方式跳过任何非数字元素。以下是一些例子:

(tree-min #(3 2 nil (2 1 -20) 100 20 ))
=> -20

(tree-min nil)
=> nil

(tree-min '(a 20))
=> 20

在实践中,您可以将此函数推广为像Dos一样的比较函数。

使用99999确实是一种黑客行为(不是一种好的黑客行为),请不要这样做。使用
:infinity
稍微好一点,但是当给出一个空列表时,您是否希望结果是
:infinity
循环
方法更好,但是当列表为空时,最小化返回0,这通常不是我们想要的

最小值函数对于零值是未定义的,因此我将定义一个
tree min
函数,其中当树不包含数字时,结果为
nil
。大概是这样的:

(定义树最小值(树)
(打字机)
带数字的基本情况
(数字树)
字符串也是序列,但不要迭代它们。
(字符串零)
向量和列表
(顺序(减少)(λ(ME)
(let((em(tree mine)))
(或(和m em(min em m));阿姆?
em)))
树
:初始值(零)
该函数以静默方式跳过任何非数字元素。以下是一些例子:

(tree-min #(3 2 nil (2 1 -20) 100 20 ))
=> -20

(tree-min nil)
=> nil

(tree-min '(a 20))
=> 20

在实践中,您可以将此函数推广为使用类似的比较函数。

要揭开循环魔法的神秘面纱:这主要是一个风格问题,但您可以在单个最小化关键字内执行测试。要揭开循环魔法的神秘面纱:这主要是一个风格问题,但是您可以在单个最小化关键字中执行测试。在
(null l)
案例之后添加
(atom l)
案例将允许您支持不正确的列表。在
(null l)
案例之后添加
(atom l)
案例将允许您支持不正确的列表。