2016-12-05 22 views
4

数字のリストで最小の要素を見つけようとしています。高次関数を使用するリスト内の最小要素

明示的な再帰を使用している場合これは簡単ですが、私はもっぱら

mapのような組み込みの高階関数を使用して、これを行う方法を探しています、

filter

およびfoldr

つまり、私が探しているものを得るためにこれらの機能の組み合わせを使用したいと思います。

+0

過度に慣れていないが、あなたが繰り返し最初よりも小さいすべての要素をフィルタリングすることができリストサイズが1になるまでリスト内の1つ? – gowrath

答えて

1

foldrを使用します。アキュムレータは+ inf.0で始まります。 combine-accumulator-and-elementは、アキュムレータと要素の最小値を返す必要があります。

+0

なぜfoldrの代わりにfoldlをお勧めしますか? foldlの使用と比較してどのような違いがありますか? – naomik

+0

私はちょうど質問で述べたのと同じ折り畳みを選んだ。あなたは正しい:この場合、foldlは引数の順番に依存しないので、foldlはより良いでしょう。 – soegaard

+0

wups私は 'foldl'が良いと示唆することを意味しませんでした。私は正直なところ、両方の値が同じ戻り値になるときに、どちらを使うのが良いのか分かりません。 – naomik

1

数字のリストの中で最小の要素を見つけようとしています。

明白な方法は、あなた自身のmin手順を実装する必要がある場合は、内蔵しかしmin

#lang racket 

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

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 
関連する問題