OCaml函数需传2个参数但仅需1个?求最长递增子列表函数修复
解决OCaml最长连续递增子列表函数的参数冗余问题
嘿,我看你现在卡在这个OCaml函数的参数问题上了——明明只需要传入目标列表,结果函数却要求两个参数对吧?这问题其实出在你递归辅助函数的初始调用逻辑上,咱们一步步来修正。
问题根源
你写的递归辅助函数aux需要多个参数来跟踪状态,但主函数increasing没有给aux预设好初始的状态值,导致调用increasing时不得不手动传入这些额外参数。咱们只需要在主函数内部给aux传入初始状态,就能让主函数只接收1个列表参数。
修正后的完整代码
先给你调整好的可运行代码,后面再拆解解释:
let increasing list = let rec aux inputList currentLongestList currentHighestList lastInsertedElement = match inputList with | [] -> (* 遍历结束,选出最长的子列表并反转回正序 *) let final_longest = if List.length currentLongestList > List.length currentHighestList then currentLongestList else currentHighestList in List.rev final_longest | hd :: tl -> if currentHighestList = [] || hd > lastInsertedElement then (* 当前元素可以加入当前递增子列表,更新状态继续遍历 *) aux tl currentLongestList (hd :: currentHighestList) hd else (* 当前元素中断递增,先更新最长列表,再重置当前子列表 *) let new_longest = if List.length currentLongestList > List.length currentHighestList then currentLongestList else currentHighestList in aux tl new_longest [hd] hd in (* 给辅助函数传入初始状态:初始最长为空,当前子列表为空,初始对比值用最小整数 *) aux list [] [] min_int
关键调整点
- 主函数封装初始参数:在主函数最后调用
aux时,直接传入目标列表、空的初始最长子列表、空的初始当前累积子列表、min_int(OCaml内置最小整数,因为第一个元素会触发currentHighestList = []的分支,这个值不会影响第一个元素的处理),这样increasing就只需要接收1个参数了。 - 修复原代码的逻辑错误:原代码在遍历结束的分支里,你写的是
else currentLongestList,这会导致不管当前累积的子列表多长,都返回初始的最长列表,现在修正为返回更长的那个。 - 添加列表反转:因为咱们是把新元素加到当前子列表的头部(
hd :: currentHighestList),所以累积的子列表是倒序的,最后需要用List.rev反转回正确的递增顺序。
测试示例
比如调用increasing [1;3;2;4;5;1],会返回[2;4;5],符合最长连续递增子列表的要求。
内容的提问来源于stack exchange,提问作者JLFG4356
相关产品推荐
相关产品推荐

