我想查找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