注意:这是我之前关于 powerset 的问题的续集。
我有一个很好的 Ruby 解决方案来解决我之前关于在不需要保留堆栈的情况下生成集合的 powerset 的问题:
class Array
def powerset
return to_enum(:powerset) unless block_given?
1.upto(self.size) do |n|
self.combination(n).each{|i| yield i}
end
end
end
# demo
['a', 'b', 'c'].powerset{|item| p item} # items are generated one at a time
ps = [1, 2, 3, 4].powerset # no block, so you'll get an enumerator
10.times.map{ ps.next } # 10.times without a block is also an enumerator
它可以完成工作并且效果很好。
但是,我想尝试在 Erlang 中重写相同的解决方案,因为对于该{|item| p item}
块,我已经用 Erlang 编写了大部分工作代码(它对每个生成的子集都做了一些事情)。
虽然我对 Erlang 有一些经验(我已经阅读了所有 2 本书 :)),但我对sepp2k对我之前关于 powersets 的问题的示例和评论感到非常困惑。我不明白示例的最后一行 - 我唯一知道的是列表理解。我不明白如何修改它以便能够对每个生成的子集执行某些操作(然后将其丢弃并继续下一个子集)。
如何在 Erlang 中重写这个 Ruby 迭代 powerset 生成?或者也许提供的 Erlang 示例已经几乎满足了需要?