如何更改代码,以便在切片列表时最后一个元素是排他性的?

时间:2019-05-04 00:06:37

标签: recursion ocaml slice

我正在尝试在OCAML中创建切片函数,并且它做了我想要的事情,只是它不排除列表中的最后一个元素。我知道为什么会这样做,但是我不确定如何更改代码,使其不包含最后一个元素。

slice ["a";"b";"c";"d";"e";"f";"g";"h"] 2 6;;

这是我正在测试的代码,我可以在代码中看到,这基本上就是步骤。

slice ["a";"b";"c";"d";"e";"f";"g";"h"] 2 6
slice ["b";"c";"d";"e";"f";"g";"h"] 1 5
slice ["c";"d";"e";"f";"g";"h"] 0 4

,由于现在i = 0,因此该功能已完成。但是我不确定如何从右边切。我希望输出为

["c"; "d"; "e"; "f"]

这是我正在使用的代码。

let rec slice lst i j = match lst with
    | [] -> []
    | h :: t -> if (j > List.length lst) then slice lst i (List.length lst) 
                else if i > j then []            
                else if i = 0 then h :: (slice t 0 (j - 1)) 
                else slice t (i - 1) (j - 1);;

1 个答案:

答案 0 :(得分:1)

由于第二个索引是互斥的,因此您似乎想在i> = j而不是i> j时停止递归。