我的老师说我们不能在我们的程序中使用@,所以我要为它编写自己的递归函数。
这是我到目前为止所拥有的:
(我自己的追加功能)
let rec appends a b =
match a with
| [] -> b
| hd::[]-> hd::b
| hd::tl-> (what i need help on)
;;
我不知道如果a是一个包含多个元素的列表,然后调用追加到第一部分,我只是不知道如何添加a的最后一个元素,因为你只能用::删除列表的第一个元素 任何建议将不胜感激
答案 0 :(得分:2)
可能有所帮助的是在功能上进行更多思考,即将代码视为原则上附加两个列表的定义。这与将代码视为要执行的一组动作相反。有时这会有所帮助,尤其是在使用函数式语言进行编码时。
因此,您的第一个案例说明:如果a
为空,则追加a
和b
的结果只是b
本身。
您的第二个案例说明:如果a
是一个元素hd
的列表,则追加a
和b
的结果是一个由{{1}组成的列表添加到hd
的开头。
您正在寻找适用于任何非空列表b
的附加的一般定义。关键的见解是您的定义可以是递归的,即它可以使用您的a
函数。
所以这是一个建议的定义:如果appends
是一个头部为a
且尾部为hd
的列表,则追加tl
和{{1}的结果}}是一个列表,其头部为a
,其尾部为b
附加到hd
。
(这实际上让整个事情消失了。我希望它不会破坏你的锻炼。)