前置和反转列表没有任何问题。@您可以在单元素列表上使用append( ),但这是一种代码味道。可接受的(尾递归)方法是:
let appendSingle xs x =
[ yield! xs
yield x ]
Run Code Online (Sandbox Code Playgroud)
上述所有解决方案的执行时间均为 O(n)。对于您的用例,您可以保留私有ResizeArray以避免使用反向。这很好,因为可变性是隐藏的。比较这个功能
let filter f l =
let rec loop acc l =
match l with
| [] -> List.rev acc
| x::xs when f x -> loop (x::acc) xs
| x::xs -> loop acc xs
loop [] l
Run Code Online (Sandbox Code Playgroud)
与其更有效的对应物
let filter f l =
let rec loop (acc : ResizeArray<_>) l =
match l with
| [] -> Seq.toList acc
| x::xs when f x ->
acc.Add(x)
loop acc xs
| x::xs -> loop acc xs
loop (ResizeArray()) l
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1441 次 |
| 最近记录: |