【发布时间】:2025-12-16 05:05:02
【问题描述】:
在 Data.List 模块中有一个 inits 函数,例如,[1,2,3,4] -> [[],[1],[1,2],[1,2,3],[ 1,2,3,4]]
我正在尝试使用递归定义类似的函数,但是我想不出一种按正确顺序执行的方法。我得到的最接近的是向后的列表,result = [[],[4],[3,4],[2,3,4],[1,2,3,4]]:
inits' :: [Int] -> [[Int]]
inits' [] = [[]]
inits' (x:xs) = inits' xs ++ [(x:xs)]
我不确定如何通过按正确顺序一次添加一个元素来创建列表?有人可以指出正确的方向,还是不能通过递归来做?
【问题讨论】:
-
提示:您可以使用差异列表。
-
@WillemVanOnsem,这在大多数情况下都是一个很好的方法,但即使在奇怪的情况下也能获得最佳性能,最好使用适当的队列。
-
特别是,强制整个结果应该是 O(n^2),但到达任何结果列表的任何元素理想情况下应该是 O(i+k)(即到该元素的距离) .同时完成这两个似乎需要一个持久队列。
-
这个question 似乎解决了
inits的有效版本。 -
另一方面,我忘记了优化的简单方法(大 O,但具有平庸的常数因子):使用
take。但这对于这个问题可能还不够“递归”。