查找列表元素之间的距离

时间:2014-12-22 10:25:17

标签: f#

我有一个数字列表,想要获取数字之间的距离列表。 例如:

[1; 3; 8; 10; 12] → [2; 5; 2; 2]

这是我的代码:

let rec diffs lst acc =
  match List.length lst > 1 with
  | true ->
      let first = List.head lst
      let second = List.head (List.tail lst)
      diffs (List.tail lst) (List.append acc [second - first])
  | false -> acc

我只是想知道是否有更好的解决方案?

2 个答案:

答案 0 :(得分:8)

使用F#开箱即用的最直接的方式可能是:

let diffs =
   Seq.pairwise
   >> Seq.map (fun (a,b) -> b - a)
   >> List.ofSeq

一般来说,List.headtailappend的来电,特别是如果它们出现在递归函数中,在我的书中是温和的代码味道。它们通常意味着函数可以用不同的,更简化的方式编写(例如 - @ John在另一个答案中的方法,您可以更容易地映射到您开始使用的代码)。

还有一个提示 - 您使用(List.append acc [second - first])扩展累加器,这非常浪费。您需要遍历并复制整个列表以在最后添加元素。通常的模式是添加头部((second - first) :: acc)中的元素,并在返回时反转累加器。

答案 1 :(得分:3)

翻译成更惯用的东西

let rec diffs lst =
  match lst with
  | head::head2::tail -> (head2-head)::(diffs (head2::tail)
  | _ -> []