我目前正在学习函数式编程和F#,我想在n-2之前进行循环控制.例如:
Given a list of doubles, find the pairwise average,
e.g. pairwiseAverage [1.0; 2.0; 3.0; 4.0; 5.0] will give [1.5; 2.5; 3.5; 4.5]
Run Code Online (Sandbox Code Playgroud)
在做了一些实验和搜索后,我有几种方法可以做到:
方法1:
let pairwiseAverage (data: List<double>) =
[for j in 0 .. data.Length-2 do
yield (data.[j]+data.[j+1])/2.0]
Run Code Online (Sandbox Code Playgroud)
方法2:
let pairwiseAverage (data: List<double>) =
let averageWithNone acc next =
match acc with
| (_,None) -> ([],Some(next))
| (result,Some prev) -> ((prev+next)/2.0)::result,Some(next))
let resultTuple = List.fold averageWithNone ([],None) data
match resultTuple with
| (x,_) -> List.rev x
Run Code Online (Sandbox Code Playgroud)
方法3:
let pairwiseAverage (data: List<double>) =
// Get elements from 1 .. n-1
let after = List.tail data
// Get elements from 0 .. n-2
let before =
data |> List.rev
|> List.tail
|> List.rev
List.map2 (fun x y -> (x+y)/2.0) before after
Run Code Online (Sandbox Code Playgroud)
我只想知道是否还有其他方法可以解决这个问题.谢谢.
仅使用内置插件:
list |> Seq.windowed 2 |> Seq.map Array.average
Run Code Online (Sandbox Code Playgroud)
Seq.windowed n为您提供每个n个元素的滑动窗口.
另一种简单的方法是使用 Seq.pairwise
就像是
list |> Seq.pairwise |> Seq.map (fun (a,b) -> (a+b)/2.0)
Run Code Online (Sandbox Code Playgroud)