1

你能解释一下为什么下面的代码是错误的:

powerset
     |ps|
     ps := Set with: (Set new).
     self do: [:item | ps addToPowerSet: item].
    ^ps

addToPowerSet: elt
    | first second third var |
    first := self copy.  
    second := self copy.  
    third := Set new.
    second do:  [:item | var := item copy. var add: elt. third add: var.].
    ^ first addAll: third

这两种方法都在 Set 类中实现。我试图调试它,我想错误就在这里:

second do:  [:item | var := item copy. var add: elt. third add: var.].

但我不知道具体是什么。

好的,addToPowerSet 方法的示例:

让我们假设 powerset 变量 ps 是相等的:

{{empty}, {a}, {b}, {a,b}}

和项目= c。addToPowerSet 方法应该返回:

{
    {empty}, {a}, {b}, {a,b},
    {c}, {a, c}, {b, c}, {a,b,c}
}
4

2 回答 2

3

不太熟悉stackoverflow中的格式,但是每次调用 addToPowerSet: 时返​​回一个新集合不是问题吗?这似乎有效:

    addToPowerSet: elt
| second third var |
second := self copy.
third := Set new.
second do: 
        [:item |
        var := item copy.
        var add: elt.
        third add: var].
^self addAll: third
于 2013-09-13T14:45:16.383 回答
0

首先,您的设计存在两个问题,因此您想要的是错误的

  1. c addToPowerSet处理任何对象,您必须将其添加到Object.
  2. 该表达式c addToPowerSet不指代幂集。

应该做的是创建一个Set覆盖该add:方法的子类,或者Set添加一个方法addToPowerset:来处理接收器不是powerset的情况。

于 2013-09-04T19:53:08.133 回答