F#,循环控制直到n-2

CH *_*Ben 3 f#

我目前正在学习函数式编程和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)

我只想知道是否还有其他方法可以解决这个问题.谢谢.

hlo*_*hlo 9

仅使用内置插件:

list |> Seq.windowed 2 |> Seq.map Array.average
Run Code Online (Sandbox Code Playgroud)

Seq.windowed n为您提供每个n个元素的滑动窗口.


Joh*_*mer 7

另一种简单的方法是使用 Seq.pairwise

就像是

list |> Seq.pairwise |> Seq.map (fun (a,b) -> (a+b)/2.0)
Run Code Online (Sandbox Code Playgroud)