clojure - возвращает среднее значение всех чисел в дереве

Задача 1.3 (a) Напишите функцию с именем nested-average, которая принимает в качестве единственного аргумента вложенный список чисел (то есть дерево). Функция nested-average должна возвращать среднее значение всех чисел в дереве. Например (nested-medium '(10 ((30 1) 20) (8 (5 (50 7)) 9) 40)) ==> 18 (b) Аналогично 2.4, но новая функция (называется «stats») возвращает наименьший, самый большой, средний и средний профиль чисел в дереве. Значения, которые будут возвращены на карте. (c) Как указано выше, но для определения возвращаемой статистики требуется последовательность компараторов (например, <,> = или определенная пользователем).

Всего 3 ответа


(defn bounds [tree]
  (apply (juxt min max) (flatten tree)))

(bounds '(1 (-2 17 (4)) -8 (-6 13)))
=> [-8 17]

Альтернативный способ сделать это

(defn bounds [l]
  [(first (sort (flatten l))) (last (sort (flatten l)))])

Чтобы сохранить вызов sort вы можете использовать

(defn bound [l]
  (let [s (sort (flatten l))]
    [(first s) (last s)]))

И чтобы удовлетворить «смешанное» требование, вы можете добавить вызов filter :

(defn bounds [l]
  (let [s (sort (filter number? (flatten l)))]
    [(first s) (last s)]))

Так как вы попросили рекурсивное решение.

(defn bounds [tree]
  (letfn [(find-min-max [tree mi ma]
            (reduce (fn [[mi ma] elm]
                      (cond
                        (number? elm) (if (and (nil? mi) (nil? ma))
                                        [elm elm]
                                        [(min mi elm) (max ma elm)])
                        (coll? elm) (find-min-max elm mi ma)
                        :default [mi ma]))
                    [mi ma]
                    tree))]
    (find-min-max tree nil nil)))
(bounds [1 [2 3 [4 [5 6 [7 [8 [9] -99 [11 [12 "ss" [34 [34 [34 [23 [23 :some-key]]]]]]]]]]]]]);; => [-99 34]

Есть идеи?

10000