我想知道如何编写一个将给定列表划分为给定点的子列表的函数,交换这些子列表并返回结果列表。
例如:
swap([1;3;5;6],2) => [5;6;1;3]
我想我开发的代码是正确的吗?
let rec swap (l,n) =
let rec loop t (count,laux) =
match t with
| h::t when count < n -> loop t (count+1, h::laux)
| h::t -> h::t@ List.rev laux
| []->[]
in
loop l (0,[])
;;
答案 0 :(得分:3)
你快到了。问题是当l
的长度大于或等于n
时,您的函数处理的情况不正确。
模式[]
并不意味着输入列表为空;这意味着我们走到了列表的最后。那时你应该做的是以相反的顺序返回累加器acc
。
我稍微重新排列模式,因此基本情况首先出现:
let rec swap (l, n) =
let rec loop xs count acc =
match xs with
| _ when count = n -> xs @ List.rev acc
| [] -> List.rev acc
| h::t -> loop t (count+1) (h::acc)
in loop l 0 []