F#查找没有长度的中位数

时间:2018-07-08 15:33:45

标签: f#

我正在为即将进行的函数式编程考试做准备。我收到的一个完整的问题困扰了我。

我们要编写一个接受排序列表并返回中值的函数。我们可以假设列表的长度不为0,并且为奇数。好吧,现在这很容易,除了我们不允许在列表上进行第二次显式确定其长度。没问题,我只能使用.length函数,除非我们也不允许使用任何内置函数。

这是我所做的,尽管我确实使用了.length函数:

let median list = 
let rec helper list count =
    match list with
    |(x::_) when count=0 -> x
    |(x::xs) -> helper xs (count-1)
helper list (list.Length/2)

如何计算出所需的长度以计算出中位数?

1 个答案:

答案 0 :(得分:2)

一种方法是创建一个用于查找列表后半部分的函数:

let secondHalf l =
        let rec aux xs ctr =
            match ctr with
            | _::_::ctr' ->
                match xs with
                | _::xs' -> aux xs' ctr'
                | [] -> failwith "should never happen!"
            | _ -> xs
        aux l l

然后您可以使用它来找到中位数:

let sortedMedian xs = let (m::_) = secondHalf xs in m