Использование 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
На практике можно обобщить эту функцию, чтобы взять функцию сравнения, как extremum
делает.
Спасибо большое! Это сработало. – Nelly
Добавление случая '(atom l)' сразу после случая '(null l)' позволит вам поддерживать неправильные списки. –