我有一个数字列表,想要获取数字之间的距离列表。 例如:
[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
我只是想知道是否有更好的解决方案?
答案 0 :(得分:8)
使用F#开箱即用的最直接的方式可能是:
let diffs =
Seq.pairwise
>> Seq.map (fun (a,b) -> b - a)
>> List.ofSeq
一般来说,List.head
,tail
或append
的来电,特别是如果它们出现在递归函数中,在我的书中是温和的代码味道。它们通常意味着函数可以用不同的,更简化的方式编写(例如 - @ 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)
| _ -> []