【问题标题】:Haskell Recursion: interleave function in Programming in Haskell ch.11Haskell 递归:Haskell ch.11 编程中的交错函数
【发布时间】:2015-07-07 23:04:49
【问题描述】:

我无法弄清楚 Haskell 第 11 章编程中以下“交错”函数的递归机制是如何工作的。

-- Definition
interleave :: a -> [a] -> [[a]]
interleave a [] = [[a]]
interleave x (y:ys) = (x:y:ys):map (y:) (interleave x ys)

-- Example
> interleave 3 [4,5,6,7]
[[3,4,5,6,7],[4,3,5,6,7],[4,5,3,6,7],[4,5,6,3,7],[4,5,6,7,3]]

它在底层是如何工作的?

我陷入了这样的推理:

interleave 3 [4,5,6,7]
= [3,4,5,6,7]:map (4:) (interleave 3 [5,6,7])
= [3,4,5,6,7]:[4,3,5,6,7]:map (5:) (interleave 3 [6,7])
= [3,4,5,6,7]:[4,3,5,6,7]:[5,3,6,7]:map (6:) (interleave 3 [7])
= [3,4,5,6,7]:[4,3,5,6,7]:[5,3,6,7]:[6,3,7]:map (7:) (interleave 3 [])
= [3,4,5,6,7]:[4,3,5,6,7]:[5,3,6,7]:[6,3,7]:[7,3]:[[3]]

= [[3,4,5,6,7],[4,3,5,6,7],[5,3,6,7],[6,3,7],[7,3],[3]]
???
/= [[3,4,5,6,7],[4,3,5,6,7],[4,5,3,6,7],[4,5,6,3,7],[4,5,6,7,3]]

请赐教.. 非常感谢。

【问题讨论】:

  • 你想要用于定义interleave方法的代码吗?

标签: haskell recursion


【解决方案1】:

在第二行和第三行之间你漏掉了一些东西:

[3,4,5,6,7]:map (4:) (interleave 3 [5,6,7])
= [3,4,5,6,7]:map (4:) ([3,5,6,7]:map (5:) (interleave 3 [6,7]))
= [3,4,5,6,7]:[4,3,5,6,7]:map (4:) (map (5:) (interleave 3 [6,7]))

所以最后你有一堆map (x:),所有列表都包含原始列表的所有元素

【讨论】:

    猜你喜欢
    • 2015-05-27
    • 2011-02-14
    • 2019-02-28
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    相关资源
    最近更新 更多