[英]Outputting elements from the list except first n elements
你如何写一个 F# 递归 function 接受一个正的xs
n
和一个列表xs
作为输入,并返回一个列表,除了前n
元素?
let rec something n xs = .. something 7 [1..10] = [8; 9; 10]
我不认为递归是解决这个问题的最有效方法,但你可以这样做:
let rec something n xs =
if n > List.length xs || n < 0 then failwith "incorrect parameter n - out of range"
else if n = 0 then xs
else something (n-1) (xs |> List.tail)
let res = something 7 [1..10]
open System
Console.WriteLine(res)
//something 7 [1..10] = [8; 9; 10]
简单的答案是使用List.skip
... 即[0..10] |> List.skip 5
要重新实现List.skip
你会看到类似的东西:
let rec listSkip n list =
match (n, list) with
| 0, list -> list
| _, [] -> failwith "The index is outside the legal range"
| n, _ when n < 0 -> failwith "The index cannot be negative"
| n, _ :: tl -> listSkip (n - 1) tl
由于这是递归符合尾调用优化的条件,因此性能应该类似于显式循环。
我避免了针对n
的显式保护检查List.length
因为List.length
需要整个列表的迭代(我们必须检查每一轮递归)。 因此,如果我们在n
达到0
之前遇到一个空列表,尝试删除n
项并失败会更便宜。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.