2013-09-04 3 views
1

могли бы вы объяснить, почему следующий код является неправильным:Powerset - Smalltalk

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:

Давайте assumet, что POWERSET переменной пс равна:

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

и п = с. метод addToPowerSet должен возвращать:

{ 
    {empty}, {a}, {b}, {a,b}, 
    {c}, {a, c}, {b, c}, {a,b,c} 
} 
+1

Вопросы, касающиеся проблем с кодом Вы написали должны описать конкретную проблему - и включают в себя правильный код, чтобы воспроизвести его - в самом вопросе. См. Руководство SSCCE.org. – Marcin

+0

Какой маленький штрих вы используете? Каков ваш ожидаемый результат? – camillobruni

+0

@camillobruni Я использую Dolphin Smalltalk X6 – JosephConrad

ответ

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 
0

Прежде всего, есть две проблемы с вашим дизайном, таким образом, что то, что вы хотите, это неправильно:

  1. Для c addToPowerSet, чтобы работать на любом объекте, вам пришлось бы добавить его в Object.
  2. Выражение c addToPowerSet не относится к силовому набору.

Что вы должны сделать, это создать подкласс Set, который переопределяет метод add: или на Set добавить метод addToPowerset: который должен обрабатывать случай, когда приемник не является Powerset.

Смежные вопросы