2017-11-06 15 views
0

値、私は、リスト内の最大値を返す単純な関数を構築します:ここでは最小および/または最大リストが

let finMin =  //Find smallest value in list 
fun l -> 
    let rec aux = 
     fun l k -> 
      match l with 
      | []  -> k 
      | x::xs  -> if x <= k then aux xs x 
          else aux xs k 
    aux l 0 

問題:私はk = 0の両方auxの機能を初期化します。これは部分的にのみ有効です:負の値がリストにない限り、findMaxは正しく機能します。同様に、findMinは負の数でのみ正常に機能します。

kを効率的に初期化するための適切な値は?システム依存の値はありますか?私は以前にそれを計算する必要がありますか?私は間違った側から問題に近づいていますか?

P.S.私はminmaxを見つけるためにライブラリ関数を使用しません。言語の仕組みを学んでいるからです。お待ち頂きまして、ありがとうございます。

+1

先頭の値で再帰を開始するだけではどうですか。それは常に単一の項目リストの最小/最大です。その後、テールを繰り返してください。 – Sean

答えて

3

リストの最初の項目を最小値または最大値にすることができます。次に、リストの残りの部分を繰り返します。例:

let myMax items = 
    match items with 
    | [] -> failwith "no data" 
    | head :: tail -> 
     let rec recMax maxSoFar items = 
      match items with 
       | [] -> maxSoFar 
       | head :: tail -> 
        if head > maxSoFar then 
         recMax head tail 
        else 
         recMax maxSoFar tail 
     recMax head tail 
4

System.Int32.MaxValueである必要があります。また、ネガを正しく使用するためにfindMaxにはSystem.Int32.MinValueを使用する必要があります。

+1

あなたの答えをありがとう。それが完璧で問題を正しく解決したとしても、もう一つの答えで終わりました。それは実際に私が言語の理解を深められるようにするためです。再度、あなたの貢献に感謝します。 – Worice

+0

心配しないで、もう一つの答えを見て、私は両方のアプローチが正しいと思う、もう一つは数学の観点からより正確ですが、これは現実世界の計算のために簡単です。他のアプローチのもう1つの利点は、一般化する方が簡単だということです。 – Gustavo

関連する問題