I want to find the minimum element (at any level) in a non-linear list (edit: a tree), in Lisp. I wrote something like:
rootobj.get("").getAsJsonArray();
But, it's not working (because of that condition for non-numerical atoms, I guess...). Does anyone have, any idea how to fix this code? Thanks in advance.
答案 0 :(得分:2)
您的numberp
案例永远不会执行,因为atom
案例首先被测试,而数字是原子。所以每个数字都被99999取代。先放numberp
个案例。
您的代码的另一个问题是,如果树中的最小数字大于99999,它将找不到最小的数字。要修复它而不更改代码太多,您需要自己的版本{{1 }}支持无限的表示:
min
然后,将(defun inf-min (a b)
(cond ((eq a :infinity) b)
((eq b :infinity) a)
((< a b) a)
(t b)))
替换为min
,将99999替换为inf-min
。
答案 1 :(得分:2)
使用99999实际上是一种黑客攻击(不是好的黑客攻击),请不要这样做。使用:infinity
稍微好一些,但是,在提供空列表时,您是否希望结果为:infinity
?
loop
方法更好,但是当列表为空时,最小化返回0,这通常不是我们想要的。
对于零值,最小函数未定义,因此我将定义tree-min
函数,其中当树不包含数字时,nil
中的结果为(defun tree-min (tree)
(typecase tree
;; base case with numbers
(number tree)
;; string are sequences too, but don't iterate over them.
(string nil)
;; vectors and lists
(sequence (reduce (lambda (m e)
(let ((em (tree-min e)))
(or (and m em (min em m)) ; Eminem?
em)))
tree
:initial-value nil))))
。像这样:
(tree-min #(3 2 nil (2 1 -20) 100 20 ))
=> -20
(tree-min nil)
=> nil
(tree-min '(a 20))
=> 20
该函数以静默方式跳过任何非数字元素。以下是一些例子:
Individ <- data.frame(Participant = c("Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Jane", "Jane", "Jane", "Jane",
"Jane", "Jane", "Jane", "Jane", "Jane", "Jane", "Jane", "Jane", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill"),
Time = c(1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6),
Condition = c("Placebo", "Placebo", "Placebo", "Placebo", "Placebo", "Placebo", "Expr", "Expr", "Expr", "Expr", "Expr", "Expr",
"Placebo", "Placebo", "Placebo", "Placebo", "Placebo", "Placebo", "Expr", "Expr", "Expr", "Expr", "Expr", "Expr"),
Location = c("Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home",
"Away", "Away", "Away", "Away", "Away", "Away"),
Power = c(400, 250, 180, 500, 300, 450, 600, 512, 300, 500, 450, 200, 402, 210, 130, 520, 310, 451, 608, 582, 390, 570, 456, 205))
在实践中,您可以概括此函数以采用extremum
之类的比较函数。
答案 2 :(得分:1)
(defun minimum (tree)
(loop for item in tree
if (consp item) minimize (minimum item)
else if (numberp item) minimize item))