Mentre le risposte già pubblicate sono p validamente valido per il motivo per cui il codice postato non funziona, direi che l'utilizzo di un loop e una variabile mutabile non è molto ... funzionale. Così ho pensato di postare un altro modo di fare # F - idiomatico per risolverlo.
Si dichiara "impossibile utilizzare .NET". Sto indovinando vuoi dire che non è possibile utilizzare alcuna delle funzioni integrate o librerie .NET. Ovviamente, questo significa anche che tu puoi implementarli da soli utilizzando primitive F #.
Una funzione comune nel mondo funzionale è fold
, che applica semplicemente una funzione a tutti gli elementi di una sequenza, mantenendo il ritorno di tale funzione in un accumulatore. La versione built-in è Seq.fold
, ma dal momento che non possiamo usare che, definiremo uno di noi:
let rec fold accFn arr acc =
match arr with
| [||] -> acc
| _ -> fold accFn arr.[1..] (accFn arr.[0] acc)
Questa è una funzione ricorsiva che applica la funzione accFn
ad ogni elemento, e poi si fa chiamare con il resto dell'array. Quando viene passato un array vuoto, la ricorsione termina.
Quando si ha che, definiamo alcune semplici funzioni di passare nel 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
volta abbiamo che la soluzione al problema dichiarato è semplice:
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