我想查找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
我想查找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
我固定的代碼爲最大
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
這裏要計算最大的一些邏輯問題。每次更改時,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
非常感謝你 – Massoud
雖然已發佈的答案是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
非常感謝你 – Massoud
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()
ofArray就像減少 – BLUEPIXY
使用Array.max,Array.min,Array.averageBy float – BLUEPIXY