我有一个数字列表,想要获得数字之间的距离列表.例如:
[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)
我只是想知道是否有更好的解决方案?
可能是使用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)并在返回时反转累加器.
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |