查找列表元素之间的距离

dem*_*mas 0 f#

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

[1; 3; 8; 10; 12] ? [2; 5; 2; 2]
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

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
Run Code Online (Sandbox Code Playgroud)

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

scr*_*wtp 8

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

let diffs =
   Seq.pairwise
   >> Seq.map (fun (a,b) -> b - a)
   >> List.ofSeq
Run Code Online (Sandbox Code Playgroud)

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

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