Zaten gönderilen yanıtlar p Gönderilen kodun neden çalışmadığına göre hatalı bir şekilde geçerli, bir döngü ve bir değişken değişken kullanmanın çok fazla bir şey olmadığını iddia ediyorum ... fonksiyonel. Bu yüzden daha fazla F # - idiomatik bir şekilde çözmeyi düşündüm.
".NET kullanamazsınız" durumundasınız. Sanırım, yerleşik işlevleri veya .NET kitaplıklarını kullanamayacağınız anlamına geliyor. Tabii ki, bu da 'un F # ilkellerini kullanarak bunları uygulayabileceğiniz anlamına gelir.
İşlevsel dünyadaki yaygın bir işlev, bir dizinin tüm öğelerine bir işlev uygularken fold
'dır; Yerleşik sürüm Seq.fold
, ama biz bu kullanamazsınız, çünkü biz bir kendimizi tanımlayacağız:
let rec fold accFn arr acc =
match arr with
| [||] -> acc
| _ -> fold accFn arr.[1..] (accFn arr.[0] acc)
Bu kendisini çağıran sonra her elemana accFn
fonksiyonunu uygulayan bir özyinelemeli fonksiyondur ve dizinin kalan kısmı. Boş bir diziden geçtiğinde, özyineleme sona erer.
biz bu olduğunda, en fold
geçmesine bazı basit işlevleri tanımlayalım:
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
biz belirtilen sorunun çözümü basit, yani sahip olduktan:
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
kullanımı Array.max, Array.min, Array.AverageBy float – BLUEPIXY