讓我在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
附錄
可用於類似性質的other problems同樣的技術。
smalltalk生活!最後在20年前從野外聽到。 – javadba
@javadba即使他們不再流行於流行的發行版,學習諸如Smalltalk等語言的方面也是有益的。我從好奇心中學習了Smalltalk,從多年以來我聽到的一切。我很驚訝Ruby從Smalltalk中解脫了多少。這讓我改進了一些關於現代語言編程的思考方式。我不知道你是否嘗試過Smalltalk,但它很有趣。 :)如果你真的想挑選某人,請查看[pdp-11標籤](http://stackoverflow.com/questions/tagged/pdp-11)。 :) – lurker
Smalltalk程序員在遙遠的過去當時被廣泛推崇。當面試擁有ST的C++作業時,幾乎是「你沒事了」(我遇到過每個ST程序員)。除了在大型電信設備的孤立情況下,我不認爲它還活着。 – javadba