Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 在F中找到最大值、最小值和平均值#_F#_F# Interactive - Fatal编程技术网

F# 在F中找到最大值、最小值和平均值#

F# 在F中找到最大值、最小值和平均值#,f#,f#-interactive,F#,F# Interactive,我想在F#中没有.NET的数组中找到最大值、最小值和平均值。 我使用了此代码,但它不起作用: 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 设可变最大值=0 设arrX=[9;1

我想在F#中没有.NET的数组中找到最大值、最小值和平均值。 我使用了此代码,但它不起作用:

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
设可变最大值=0
设arrX=[9;11;3;4;5;6;7;8]
因为我在0。。arrX.长度-2 do
如果(arrX[i])<(arrX[i+1]),那么

max这里计算max有一些逻辑问题。每次更改时,
printfn
的位置将打印最大值。以下代码起作用:

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
设arrX=[9;11;3;4;5;6;7;8]
因为我在0。。arrX.Length-1do
如果maxmax我为max修改了你的代码

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

虽然已经发布的答案对于为什么您发布的代码不起作用是完全有效的,但我认为使用循环和可变变量并不是非常有效的。。。功能的所以我想我会发布一个更具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 of数组f(a:'T数组)=
设len=a.长度
让rec aux index ret=
如果索引>=len,则
ret
其他的
辅助(索引+1)(f a.[索引]ret)
辅助1 a[0]
设maxOfArray(a:'T数组)=of array max a
让minOfArray(a:'T数组)=数组的最小值a
让内联sumOfArray(a:'T数组)=of数组(+)a
让main()=

printfn“max:%d”使用Array.max、Array.min、Array.averageBy float注意,
fold
的这种实现效率低下,因为它在每次递归迭代之前复制数组的其余部分。看见接受计数器作为参数,并在每次迭代时将
i+1
传递给尾部调用将更有效。(尽管如此,这仍然是一个很好的例证)。
let rec fold accFn arr acc = 
    match arr with
    | [||] -> acc
    | _ -> fold accFn arr.[1..] (accFn arr.[0] acc)
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
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()