这个ocaml递归函数是如何工作的?

How does this ocaml recursive function work?

我是 ocaml 的新手,我很难使用这个函数

我知道它是做什么的,但不知道怎么做!对于给定的列表,它 returns 列表的最小值和列表的其余部分作为一对。

sepmin [2;1;3;4] == (1,[2;3;4])

val sepmin : '一个列表 -> 'a * '一个列表

# let rec sepmin = function
[h] -> h, []
|h::t -> let h1, t1 = sepmin t in
    min h h1, (max h h1)::t1;;

你们能帮我解决递归部分吗t.t

首先,它递归地应用于列表的尾部。比如说,returns h1t1 是尾部的最小值和尾部的所有其他元素。接下来,将此元素 hh1 进行比较。如果小于h1,则对(h, h1::t1)returned;否则 (h1, h::t1) 对是 returned。由于该函数是递归调用的,因此这些对中的一个可能被 returned 到前一个递归点(并且它的第一个元素再次与该点的列表头进行比较)。据我所知,该函数不太关心元素的原始顺序,即对于列表 [1; 4; 2; 5; 6] 它应该 return (1, [2; 4; 5; 6]),2 和 4 在结果。

考虑递归的一个好方法是把它分成两部分。首先,当输入微不足道时,该函数会做什么?其次(这是棘手的部分),假设该函数适用于小输入,它如何将较大的输入转换为较小的输入并使用较小情况的答案来计算较大情况的正确结果。

这个函数的简单情况是一个元素的列表。在那种情况下答案是显而易见的。

对于更长的列表,您可以使用递归能力为列表的尾部获得正确答案(这是一个较短的列表,因此递归将根据假设工作)。一旦知道列表尾部的答案,就可以构建完整列表的正确答案:列表头部和尾部答案的最大值是整体最大值。您需要将这两个值中较小的值添加回列表。