Mientras que las respuestas ya publicadas son p erróneamente válido en cuanto a por qué su código publicado no funciona, yo diría que usar un bucle y una variable mutable no es muy ... funcional. Así que pensé en publicar una forma más F # - idiomática de resolverlo.
Usted declara que "no puede usar .NET". Supongo que quiere decir que no puede usar ninguna de las funciones integradas o las bibliotecas .NET. Por supuesto, eso también significa que puede implementarlo usted mismo usando primitivas F #.
Una función común en el mundo funcional es fold
, que simplemente aplica una función a todos los elementos de una secuencia, mientras mantiene el retorno de esa función en un acumulador. La versión integrada es Seq.fold
, pero ya que no podemos usar eso, vamos a definir uno de nosotros mismos:
let rec fold accFn arr acc =
match arr with
| [||] -> acc
| _ -> fold accFn arr.[1..] (accFn arr.[0] acc)
Esta es una función recursiva que se aplica la función accFn
a cada elemento, y luego se hace llamar con el resto de la matriz. Cuando se pasa una matriz vacía, la recursión finaliza.
Cuando tenemos que, vamos a definir algunas funciones sencillas para pasar a 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
Una vez que tengamos eso, la solución al problema planteado es simple:
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
uso Array.max, Array.min, Array.averageBy float – BLUEPIXY