2017-01-31 3 views
3

私は最大値を見つけるF#関数を記述しようとしています。私はF#が初めてで、これを正しい型と再帰で実装する方法について混乱しています。F#の要素のリスト

どのように役立つかについての説明とともに、他のF#関数を作成することができるように、実際の動作を理解する必要があります。ありがとう!

+1

https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/seq.max%5B't%5D-function-%5Bfsharp%5D – Alexan

+0

私はこれを再帰的に達成しようとしているので、 Seq.max – chnutbrwn

+1

okの使用、http://stackoverflow.com/a/8463149/240564 – Alexan

答えて

3

再帰関数を作成するときは、コーナーケースについて考え始めます。あなたのヘルパー関数はリストと "これまでの最大値"をとります。コーナーケース:リストが空の場合はどうなりますか? 1つの要素リストしか持たない場合や、最初の要素に重点を置いた場合はどうなりますか?それは直接matchステートメントに変換します。

let rec helper (l, m) = 
    match l, m with 
    | [], m -> m 
    | (l1 :: rest), m -> 
     let max1 = if l1 > m then l1 else m 
     helper(rest, max1) 

は私が開いラッパーfindMaxを残しておきますが、はっきりとあなたは同じ考え方を使用していることを解決することができます:あなたは空のリストを取得する場合は何? (悲鳴を上げる!)要素を含むリストを取得するとどうなりますか?最初の要素はこれまでの最大値です。helperに残りの部分を入力してください。

もちろん、すべての関数を1つの関数に入れることができます。あなたのテンプレートコードがそのように形作られているので、私はこれをむしろ円形のhelperにしました。

3

最初に行うことは、と考えることは、再帰的および/または数学的にと考えることです。ほとんどの一般的な漠然とした用語では、 "私の関数の結果は..."のようになります。そして、実際に結果がどうなるべきかを単語に入れてみます。

  • 一つの要素のリストを与えられたとき、findMaxの結果は、その要素である:あなたの特定の問題に適用

    、私はこのようなフレーズをだろう。

  • 複数の要素のリストが指定されている場合、findMaxの結果はリストの先頭の最大値とその末尾の最大要素です。

この考え方は、F#に単語のためのほとんどの単語を翻訳することができます。

let rec findMax list = 
    match list with 
    | [x] -> x 
    | head::tail -> max head (findMax tail) 

:それはしていません:この関数は不完全であることが

let max a b = if a > b then a else b 

は注意、空のリストが与えられたときの結果を指定します。私はこれを読者のための練習として残します。