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

相关问题