2011-12-11 17 views
5

.NET, F # olmadan bir dizide en yüksek, en düşük ve ortalama bulmak istiyorum. Bu kodu kullanılır ama çalışmıyor:F # maksimum değeri, minimum ve ortalama Bul #

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 
+2

kullanımı Array.max, Array.min, Array.AverageBy float – BLUEPIXY

cevap

1

Ben senin yaklaşımını kullanarak, maksimum, minimum ve avg bulmak için

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

için kodunuzu sabit:

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) 

Ama sadece yapabileceği dikkat :

let max = Seq.max arrX 
let min = Seq.min arrX 
let avg = Seq.averageBy float arrX 
0

burada max hesaplamak için bazı mantıksal sorun vardır. Ve printfn'un yerleşimi, her değiştiğinde maks. Aşağıdaki kod çalışır:

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 
+0

Teşekkür ederim – Massoud

7

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 
+1

Teşekkür ederim – Massoud

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() 
+0

ofArray azaltmak gibi – BLUEPIXY