我对ocaml很新,而且我很难用这个功能
我知道它做了什么但不知道怎么做!使用给定列表,它将返回列表的最小值和列表的其余部分作为一对。
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
答案 0 :(得分:1)
首先,它以递归方式应用于列表的尾部。比如说,它返回h1
和t1
,它们是尾部的最小值和尾部的所有其他元素。接下来,将此元素h
与h1
进行比较。如果它小于h1
,则对(h, h1::t1)
返回;否则返回对(h1, h::t1)
。由于函数是递归调用的,因此这些对中的一个可能返回到前一个递归点(并且它的第一个元素再次与该点的列表头进行比较)。据我所知,该函数并不关心元素的原始顺序,即对于列表[1; 4; 2; 5; 6]
它应返回(1, [2; 4; 5; 6])
,2和4在结果中重新排序。
答案 1 :(得分:0)
考虑递归的好方法是将其分为两部分。首先,当输入是微不足道时,函数会做什么?第二个(这是棘手的部分),假设函数适用于小输入,它如何将较大的输入转换为较小的输入,并使用较小的情况的答案来计算更大的情况下的正确结果。
此函数的简单情况是一个元素的列表。在这种情况下答案是显而易见的。
对于更长的列表,您可以使用递归功率来获得列表尾部的正确答案(这是一个较短的列表,因此递归将通过假设起作用)。一旦知道了列表尾部的答案,就可以为完整列表构建正确的答案:列表头部的最大值和尾部的答案是总体最大值。您需要将这两个值中较小的一个添加回列表。