查找F#中的最大值,最小值和平均值

时间:2011-12-11 08:20:42

标签: f# f#-interactive

我想在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

4 个答案:

答案 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()