如何用List.hd、List.tl、List.length实现移除列表最后一个元素
移除列表最后一个元素的OCaml实现方案
先说说你写的代码里的问题:
- 函数里用到变量
n,但既没把它作为参数传入,也没在函数内计算赋值 - 递归调用时写错了函数名,应该是
remove_last而非remove - 函数调用语法错误,正确写法是
remove_last ["one" ; "two" ; "three"],不需要额外加l
按照要求只能用List.hd、List.tl、List.length的限制,我们可以先获取列表长度,再通过递归截取前长度-1个元素来实现功能,以下是可行的实现代码:
let rec remove_last l = let len = List.length l in match l with | [] -> [] | head :: tail when len = 1 -> [] | head :: tail -> head :: remove_last tail;; // 测试调用 remove_last ["one" ; "two" ; "three"];;
也可以用辅助函数传递剩余需保留的元素个数来实现,逻辑更清晰:
let remove_last l = let rec helper remaining lst = match lst with | [] -> [] | head :: tail when remaining = 1 -> [] | head :: tail -> head :: helper (remaining - 1) tail in helper (List.length l) l;; // 测试调用 remove_last ["one" ; "two" ; "three"];;
这两种写法都能满足需求:空列表处理后返回空,单元素列表处理后返回空,多元素列表会移除最后一个元素。
内容的提问来源于stack exchange,提问作者user21450992
相关产品推荐
相关产品推荐

