【问题标题】:clojure - return the average of all numbers in a tree [closed]clojure - 返回树中所有数字的平均值 [关闭]
【发布时间】:2020-05-25 18:41:15
【问题描述】:

问题 1.3 (一种) 编写一个名为 nested-average 的函数,它将一个嵌套的数字列表作为其唯一参数(即一棵树)。函数 nested-average 应该返回树中所有数字的平均值。例如 (nested-average ' (10 ((30 1) 20) (8 (5 (50 7)) 9) 40)) ==> 18 (b) 与 2.4 类似,但新函数(称为“stats”)返回树中数字的最小、最大、计数和平均分布。要在地图中返回的值。 (c) 同上,但采用一系列比较器(如 = 或用户定义)来确定返回哪些统计信息

【问题讨论】:

  • 请添加您尝试过的内容以及失败的原因,以便我们从那里改进。 SO 不是离岸编码服务。

标签: clojure


【解决方案1】:
(defn bounds [tree]
  (apply (juxt min max) (flatten tree)))

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

【讨论】:

    【解决方案2】:

    另一种方法是

    (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)]))
    

    【讨论】:

    • 感谢 m8,我的导师说他只想要使用头尾递归的最小值和最大值我该怎么做?提前致谢
    • 一种方法是在你的函数中隐藏一个排序实现并递归调用它直到集合被排序,然后返回排序集合的第一个和最后一个元素。要确定集合是否已排序,您可以使用 (defn is-ordered? [compare-func col] (not (contains? (set (map #(try (apply compare-func %) (catch Exception e true)) (partition 2 1 col))) false)))
    【解决方案3】:

    既然您要求递归解决方案。

    (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]
    

    【讨论】:

    • 感谢您的传奇,我在大学自动取款机,每周学习都需要这个,我将如何返回带有数字的字符串?
    • 如果我理解正确,您想考虑带数值的字符串吗?像“99”、“10.0”……然后创建一个函数,尝试将数字字符串转换为数字。如果函数不成功,它应该只返回 nil。在归约函数的开头添加一个 let 子句 (let [elm (or (my-to-int-fn elm) elm)]..
    猜你喜欢
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多