【发布时间】:2016-10-16 08:40:02
【问题描述】:
如果我像这样调用函数interleave(定义如下 - 它是一个在列表的每个位置插入一个数字(或任何类型)的函数),结果列表的长度都是相同的
interleave 1 [2,3,4]
[[1,2,3,4],[2,1,3,4],[2,3,1,4],[2,3,4,1]]
但是,我预计列表长度会越来越短,因为对interleave 的递归调用会通过列表减去头部(即只有ys)。由于每次调用后列表的尾部都会越来越短,因此我希望生成的列表会更短。
interleave :: a -> [a] -> [[a]]
interleave x [] = [[x]]
interleave x (y:ys) = (x:y:ys) : map (y:) (interleave x ys)
如果递归调用的列表参数越来越短,列表如何最终保持相同的长度?
我能想象的唯一答案是映射值 map (y:) 在递归调用中表示不止一位(即它是 [2,1,3,4] 中的 2 和 [2, 3,1,4] 和 [2,3,4,1] 中的2,3,4,但我不确定这是否可能,我不知道如何在 haskell 中执行期间记录值。
问题,换句话说,y(列表的头部)能否在递归调用中表示多个值?
在回答问题时(如果相关),请确认/解释(x:y:ys) : map (y:) (interleave x ys) 中的(x:y:ys) 是否仅代表一个列表(即它是插入整数参数的 [1,2,3,4-在第一位置)。
(如果您可以显示函数的执行顺序,或者值如何存储在堆栈中,这可能会有所帮助)
【问题讨论】:
-
注意,我很难确定要问的正确问题。如果问题应该以不同的方式提出,请告诉我。
-
看到了很多不好的问题,让我向你保证:你做得很好。