Haskell子集递归
我对stack overflow和Haskell是新手,所以如果有其他方法,请告诉我 这在很大程度上重复了这个堆栈溢出问题,但是这个问题得到的答案并没有真正帮助我,我仍然对这个问题中的递归是如何工作的感到困惑。这是我为这个问题再次开始对话的尝试 问题是: 我对以下代码中的递归是如何工作的感到困惑:Haskell子集递归,haskell,recursion,subset,Haskell,Recursion,Subset,我对stack overflow和Haskell是新手,所以如果有其他方法,请告诉我 这在很大程度上重复了这个堆栈溢出问题,但是这个问题得到的答案并没有真正帮助我,我仍然对这个问题中的递归是如何工作的感到困惑。这是我为这个问题再次开始对话的尝试 问题是: 我对以下代码中的递归是如何工作的感到困惑: subsets :: [a] -> [[a]] subsets [] = [[]] subsets (x:xs) = [zs | ys <- subsets xs, zs <- [y
subsets :: [a] -> [[a]]
subsets [] = [[]]
subsets (x:xs) = [zs | ys <- subsets xs, zs <- [ys, (x:ys)]]
我了解如何递归调用子集,以及如何访问子集[]=[[]]
,但我不清楚它如何返回列表列表,以及它如何返回一些列表,如[1]
,[1,3]
,和[2,3]
再说一遍,我对堆栈溢出还不熟悉,所以请告诉我除了重复这个问题之外,还有没有更好的方法 让我们首先澄清
子集[3]
。记住ys[zs | ys[zs | ys[zs | ys]你不了解的最小输入是什么?你了解子集[3]
是如何工作的吗?你了解子集[2,3]
是如何工作的吗?我知道子集[3]
可以工作,但列表中的任何整数都不能超过一个,我不明白。zs如何澄清我上面的问题:我假设subset[]
返回[[]]
这是一个空列表的列表,但最终输出仅显示为单个列表[]
。输出:[[]],[3]]
为了完整起见,troll版本:subsets=filterM(return[True,False])
非常感谢!!!我现在明白了我是如何看待代码错误的。
*Main> subsets [1,2,3]
[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
subsets (x:xs) = [zs | ys <- subsets xs, zs <- [ys, (x:ys)]]
Aggregate all zs
where ys takes on in turn each of the subsets of the list without x,
and for each ys,
zs takes on the subset ys, and the subset ys and x together
subsets [2,3]
=> ys takes on in turn each of the subsets of the list without 2
=> [[], [3]]
=> for each ys,
zs takes on the subset ys, and the subset ys and 2 together
=> [[], [2], [3], [2,3]]