以下是子序列的代码
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]
。
这是我感到困惑的地方,它是如何到达子序列的末尾,即空列表,我应该把它看作两个不同的部分?我无法弄清楚这是如何递归调用的。
答案 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]
的最终元素。