2016-12-05 52 views
4

我正試圖在數字列表中找到最小的元素。使用高階函數的列表中最小的元素

使用明確的遞歸時,這是微不足道的,但我在尋找一種方式來做到這一點僅僅使用內置的高階功能,如

map

filter

foldr

換句話說,我想使用這些功能的組合來獲得我正在尋找的東西。

+0

不是過於熟悉的計劃,但你能反覆篩選小於第一的所有元素一個在列表中,直到列表大小是一個? – gowrath

回答

1

使用foldr。累加器以+ inf.0開始。聯合收集器和元件應該返回最小的蓄能器和元件。

+0

好奇你爲什麼推薦foldl而不是foldr?與使用foldl相比有什麼不同? – naomik

+0

我剛剛挑選了與問題中提到的相同的摺疊。你是對的:foldl在這種情況下會更好,因爲'min'不依賴於參數的順序。 – soegaard

+0

wups我不是故意建議'foldl'更好。我真的不知道什麼時候使用一個更好,當它們都導致相同的返回值 – naomik

1

我正試圖找到數字列表中最小的元素。

最顯而易見的方法是使用內置的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 
0

你也可以使用列表上的「排序」功能,然後取排序列表的第一個元素:

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