我想在F#中找到没有.NET的数组中的最大值,最小值和平均值。 我使用了这段代码,但它不起作用:
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
答案 0 :(得分:8)
虽然已发布的答案完全有效,但为什么您发布的代码不起作用,我认为使用循环和可变变量并非...... 功能。所以我想我会发布更多的F# - 解决它的惯用方法。
您声明您不能使用.NET&#34;。我猜你的意思是你不能使用任何内置函数或.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 :(得分:1)
我修改了你的代码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
使用您的方法查找max,min和avg:
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
答案 2 :(得分:0)
这里计算max有一些逻辑问题。 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
答案 3 :(得分: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()