【问题标题】:Smallest element in a list using higher-order functions使用高阶函数的列表中的最小元素
【发布时间】:2016-12-05 00:28:22
【问题描述】:

我试图在数字列表中找到最小的元素。

在使用显式递归时这很简单,但我正在寻找一种方法来仅使用内置的高阶函数来做到这一点,例如

map,

filter,

foldr

换句话说,我想使用这些功能的组合来获得我正在寻找的东西。

【问题讨论】:

  • 对scheme不太熟悉,但能否反复过滤所有小于列表中第一个元素的元素,直到列表大小为1?

标签: scheme racket higher-order-functions


【解决方案1】:

使用文件夹。累加器以 +inf.0 开头。 combine-accumulator-and-element 应该返回累加器和元素中的最小值。

【讨论】:

  • 好奇你为什么推荐 foldl 而不是 foldr?与使用 foldl 相比会有什么不同?
  • 我刚刚选择了与问题中提到的相同的折叠。你是对的:在这种情况下 foldl 会更好,因为 min 不依赖于参数的顺序。
  • wups 我并不是要建议foldl 更好。老实说,当它们都产生相同的返回值时,我真的不知道什么时候使用一个比另一个更好
  • 对于小型列表,使用哪一个并不重要。如果您查看foldlfoldr 的定义,您会发现第一个可以立即开始使用该函数,而另一个必须等​​到它到达列表末尾才能使用“返回途中的函数” "。
【解决方案2】:

我正在尝试在数字列表中找到最小的元素。

显而易见的方法是使用内置的min

#lang racket

(apply min '(5 2 3 6 4 0 9 -3 2 6))
;; => -3

但是,如果您必须实现自己的 min 过程,foldl 会帮助您。我还让这个过程在尝试在空列表上使用它时抛出错误——就像你尝试将它应用于零参数时内置的 min 会做的那样。

#lang racket

(define (min xs)
  (match xs
    ((list x xs ...) (foldl (λ (x acc) (if (< x acc) x acc))
                            x
                            xs))
    (_ (error 'min "must use non-empty list"))))


(min '(5 2 3 6 4 0 9 -3 2 6))
;; => -3

(min '())
;; => min: must use non-empty list

【讨论】:

    【解决方案3】:

    也可以对列表使用'sort'函数,然后取出排序列表的第一个元素:

    (first (sort '(5 2 3 6 4 0 9 -3 2 6) <))
    ;; => -3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多