我正在为即将进行的函数式编程考试做准备。我收到的一个完整的问题困扰了我。
我们要编写一个接受排序列表并返回中值的函数。我们可以假设列表的长度不为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)
如何计算出所需的长度以计算出中位数?
答案 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