拆分列表F夏普

洛伦佐卡斯蒂略

我正在尝试编写一种将列表分成两部分的方法。该函数应返回两个列表的元组,并且该函数采用的参数是第一个列表中的项目编号,然后是该列表中的项目编号。这就是我的意思

清单[1,2,3,4]

split(1,list)->([[1],[2,3,4])split(3,list)->([1,2,3],[4])

这是我到目前为止的内容:

let rec mysplit = function
  |(n,[])->([],[])
  |(1,x::xs)->(x::[],xs)
  |(n,x::xs)->  mysplit(n-1,xs)

我不确定如何从递归调用中“捕获”元组。不知道在哪里可以有一个额外的let语句来临时保存我正在建立的列表。这是该语言的新手,因此可以学习几种不同的方法。

背风处

一个简单的实现是:

let rec mysplit = function
  |(n,[])->([],[])
  |(1,x::xs)->(x::[],xs)
  |(n,x::xs)->  let (f, s) = mysplit(n-1,xs) in (x::f, s)

您还可以编写尾递归版本:

let mysplit (n, l) = 
    let rec mysplit' n' (f, s) = function
    | [] -> (f, s)
    | (x::xs) as l' -> if n' = 0 then (f, l') else mysplit' (n'-1) (x::f, xs) xs

    let (f', s) = mysplit' n ([], []) l in (List.rev f', s)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章