我正在尝试编写一种将列表分成两部分的方法。该函数应返回两个列表的元组,并且该函数采用的参数是第一个列表中的项目编号,然后是该列表中的项目编号。这就是我的意思
清单[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] 删除。
我来说两句