2011-12-11 81 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

我固定的代碼爲最大

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#原語自己實現它們。

功能世界中的一個常見功能是fold,它只是將一個函數應用於序列的所有元素,同時保持該函數在累加器中的返回。內置的版本是Seq.fold,但由於我們不能使用,我們將定義一個自己:

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

相關問題