Несмотря на то, что уже опубликованные ответы совершенно верны в отношении того, почему ваш опубликованный код не работает, я бы сказал, что использование цикла и изменяемой переменной не очень ... функционал .Поэтому я подумал, что опубликую более идиоматический способ ее решения на 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