我正試圖在數字列表中找到最小的元素。使用高階函數的列表中最小的元素
使用明確的遞歸時,這是微不足道的,但我在尋找一種方式來做到這一點僅僅使用內置的高階功能,如
map
,
filter
,
和foldr
。
換句話說,我想使用這些功能的組合來獲得我正在尋找的東西。
我正試圖在數字列表中找到最小的元素。使用高階函數的列表中最小的元素
使用明確的遞歸時,這是微不足道的,但我在尋找一種方式來做到這一點僅僅使用內置的高階功能,如
map
,
filter
,
和foldr
。
換句話說,我想使用這些功能的組合來獲得我正在尋找的東西。
我正試圖找到數字列表中最小的元素。
最顯而易見的方法是使用內置的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
你也可以使用列表上的「排序」功能,然後取排序列表的第一個元素:
(first (sort '(5 2 3 6 4 0 9 -3 2 6) <))
;; => -3
不是過於熟悉的計劃,但你能反覆篩選小於第一的所有元素一個在列表中,直到列表大小是一個? – gowrath