Позвольте мне осуществить это в SequenceableCollection
FO r для простоты:
nextCombination09
| j |
j := self findLast: [:ai | ai < 9] ifAbsent: [^nil].
j + 1 to: self size do: [:i | self at: i put: 0].
self at: j put: (self at: j) + 1
Идея заключается в следующем: используйте лексикографический порядок для сортировки всех комбинаций. Другими словами:
(a1, ..., an) < (b1, ..., bn)
если ai = bi
для всех i
ниже некоторого индекса j
где aj < bj
.
С этим заказом первая комбинация (0, ..., 0)
и последняя (9, ..., 9)
.
Кроме того, учитывая сочетание (a1, ..., an)
следующий в этом порядке является тот, который добавляет 1
к наименьшему первенствующее индексу, это последний индекс j
где aj < 9
. Например, рядом с (2, 3, 8, 9)
находится (2, 3, 9, 9)
, так как между ними не может быть ничего.
Как только мы доберемся до (9, ..., 9)
, мы закончили и ответим nil
.
Помните, что метод выше изменяет приемник, поэтому мы должны указать copy
в приведенном ниже скрипте.
Вот скрипт, который производит все комбинации (n
ваш N
)
n := <whatever>
array := Array new: n withAll: 0.
combinations := OrderedCollection new: (10 raisedTo: n).
[
combinations add: array copy.
array nextCombination09 notNil] whileTrue.
^combinations
ADDENDUM
Тот же метод может быть использован для other problems аналогичного характера.
smalltalk живет! последний раз слышал в дикой природе 20 лет назад. – javadba
@javadba Есть преимущества для изучения аспектов языков, таких как Smalltalk, хотя они больше не могут быть в популярном обращении. Я узнал Smalltalk из любопытства из того, что я слышал об этом на протяжении многих лет. Я был поражен тем, как Рубин поднялся с Smalltalk. Это заставило меня усовершенствовать некоторые из способов, которые я думаю о программировании на современных языках. Я не знаю, пытались ли вы Smalltalk, но это весело. :) Если вы действительно хотите кого-то выбрать, перейдите к тегу [pdp-11] (http://stackoverflow.com/questions/tagged/pdp-11). :) – lurker
Программисты Smalltalk были широко уважаемы в то время в далеком прошлом. Когда собеседование для C++-заданий, имеющих ST, было почти «хорошо, что вы находитесь» (для программистов ST, которых я встречал). Я просто не думал, что он все еще жив, кроме как в отдельных случаях больших телекоммуникационных установок. – javadba