子序列的递归尚不清楚

时间:2016-12-11 02:21:41

标签: haskell

以下是子序列的代码

subsequences  [] = [[]]                                                 ---Line1
subsequences (e:es) =  subsequences es ++ map (e:) (subsequences es)    ---Line2

我不明白这个递归,即如何通过此代码获得以下输出。

subsequences [1]
[[],[1]]

根据这一点,第2行subsequences es的第一部分到达[],然后转到第1行并返回[[]], 第2行map (e:) (subsequences es)的第二部分是map (1:) [[]],它提供[[1]]。现在,这个俱乐部使用[[]] ++ [[1]]并将输出设为[[],[1]]

subsequences [1,2,3]
[[],[3],[2],[2,3],[1],[1,3],[1,2],[1,2,3]]

根据这一点,第2行subsequences es的第一部分到达[2,3], 第2行map (e:) (subsequences es)的第二部分将是map (1:) [2,3]。 这是我感到困惑的地方,它是如何到达子序列的末尾,即空列表,我应该把它看作两个不同的部分?我无法弄清楚这是如何递归调用的。

1 个答案:

答案 0 :(得分:5)

在您对subsequences [1,2,3]应该如何运作的解释中,您写道:

  

第2行map (e:) (subsequences es)的第二部分将是map (1:) [2,3]

这很接近,但不是很正确!您已将通话置于subsequences,因此它应该是

map (1:) (subsequences [2,3])

这使subsequences有机会递归并产生:

subsequences [2,3] = [[],[3],[2],[2,3]]

将其替换为之前的map表达式,我们有

map (1:) [[], [3], [2], [2,3]]
=
[[1],[1,3],[1,2],[1,2,3]]

确实是subsequences [1,2,3]的最终元素。