2011-12-11 23 views
5

F#で.NETを使わない配列で最大値、最小値、平均値を求めたい。 私はこのコードを使用するが、それは動作していない:F#の最大値、最小値、平均値を求める

let mutable max = 0 
let arrX = [|9; 11; 3; 4; 5; 6; 7; 8|] 

for i in 0 .. arrX.Length - 2 do 
    if (arrX.[i]) < (arrX.[i+1]) then 
     max <- arrX.[i] 
     printfn "%i" max 
+2

使用Array.max、Array.min、Array.averageBy float – BLUEPIXY

答えて

1

私はあなたのアプローチを使用して、MAX、MINと平均を見つけるには、最大

let mutable max = 0 
let arrX= [|9; 11; 3; 4; 5; 6; 7; 8|] 

for i in 0 .. arrX.Length - 1 do 
    if max < (arrX.[i]) then 
     max <- arrX.[i] 
     printfn "%i" max 

のためにコードを修正:

let mutable max = System.Int32.MinValue 
let mutable min = System.Int32.MaxValue 
let mutable sum = 0 
let arrX= [|9; 11; 3; 4; 5; 6; 7; 8|] 

for i in 0 .. arrX.Length - 1 do 
    if max < (arrX.[i]) then 
     max <- arrX.[i] 
     printfn "max %i" max 
    if min > (arrX.[i]) then 
     min <- arrX.[i] 
     printfn "min %i" min 
    sum <- sum + arrX.[i] 
printfn "-> max is %i" max 
printfn "-> min is %i" min 
printfn "-> avg is %f" (float sum/float arrX.Length) 

しかし、あなただけ行うことができます注意してください:

let max = Seq.max arrX 
let min = Seq.min arrX 
let avg = Seq.averageBy float arrX 
0

ここで最大を計算するためのいくつかの論理的な問題があります。 printfnの配置は、変更するたびに最大値を出力します。次のコードは動作します:

let mutable max = 0 
let arrX= [|9; 11; 3; 4; 5; 6; 7; 8|] 

for i in 0 .. arrX.Length-1 do 
    if max < arrX.[i] then 
     max <- arrX.[i] 
printfn "%i" max 
+0

ありがとうございました – Massoud

7

すでに投稿されている回答はpなぜあなたの投稿されたコードがうまくいかないのか、私はループと可変変数を使用することはあまりできないと主張します。機能。だから私はそれを解決するためのF# - 慣用的な方法を投稿すると思った。

「あなたは.NETを使用できません」と述べています。私は、組み込み関数や.NETライブラリを使用できないということを推測しています。もちろん、それはまた、がF#プリミティブを使用して自分で実装できることを意味します。

機能的な世界で共通する機能の1つは、foldです。この機能は、シーケンスのすべての要素に関数を適用し、その関数をアキュムレータに戻すだけです。内蔵されたバージョンはSeq.foldですが、我々はそれを使用することができないので、私たちは1に自分自身を定義します:

let rec fold accFn arr acc = 
    match arr with 
    | [||] -> acc 
    | _ -> fold accFn arr.[1..] (accFn arr.[0] acc) 

を。これは、各要素にaccFn機能を適用する再帰関数で、その後に自身を呼び出します配列の残りの部分。空の配列を渡すと、再帰が終了します。

我々はのはfoldに渡すためにいくつかの簡単な関数を定義してみましょう、ということがあります。

let min x y = 
    if x < y then x 
    else y 

let max x y = 
    if x > y then x 
    else y 

let sum x y = 
    x + y 

我々が述べた問題に対する解決策は単純である、ことをしたら:

let arrX= [|9; 11; 3; 4; 5; 6; 7; 8|] 
let head = arrX.[0] 
let avg = (fold sum arrX 0)/arrX.Length 
let minValue = fold min arrX head 
let maxValue = fold max arrX head 
+1

ありがとうございました – Massoud

0
let ofArray f (a : 'T array) = 
    let len = a.Length 
    let rec aux index ret = 
    if index >= len then 
     ret 
    else 
     aux (index+1) (f a.[index] ret) 
    aux 1 a.[0] 

let maxOfArray (a : 'T array) = ofArray max a 
let minOfArray (a : 'T array) = ofArray min a 
let inline sumOfArray (a : 'T array) = ofArray (+) a 

let main() = 
    printfn "max: %d" <| maxOfArray arrX 
    printfn "min: %d" <| minOfArray arrX 
    printfn "ave: %f" <| (sumOfArray arrX |> float)/(arrX.Length |> float) 

do main() 
+0

ofArrayのようなものです – BLUEPIXY

関連する問題