Permettez-moi implémenter dans SequenceableCollection
fo r Par souci de simplicité:
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
L'idée est la suivante: Utilisez l'ordre lexicographique pour trier toutes les combinaisons. En d'autres termes:
(a1, ..., an) < (b1, ..., bn)
si ai = bi
pour tous i
ci-dessous un indice j
où aj < bj
. Pour cette commande, la première combinaison est (0, ..., 0)
et la dernière (9, ..., 9)
.
De plus, étant donné une combinaison (a1, ..., an)
la suivante dans cet ordre est celui qui ajoute 1
au plus bas indice prééminent, c'est le dernier indice j
où aj < 9
. Par exemple le (2, 3, 8, 9)
suivant est (2, 3, 9, 9)
car il ne peut y avoir rien entre les deux. Une fois que nous arrivons à (9, ..., 9)
nous avons terminé, et répondons par nil
. Sachez que la méthode ci-dessus modifie le récepteur, ce qui explique pourquoi nous devons copy
dans le script ci-dessous.
Voici le script qui produit toutes les combinaisons (n
est votre N
)
n := <whatever>
array := Array new: n withAll: 0.
combinations := OrderedCollection new: (10 raisedTo: n).
[
combinations add: array copy.
array nextCombination09 notNil] whileTrue.
^combinations
ADDENDA
La même technique peut être utilisée pour other problems de nature similaire.
smalltalk lives! dernière fois entendu à l'état sauvage il y a 20 ans. – javadba
@javadba Il y a des avantages à apprendre des aspects de langues tels que Smalltalk même s'ils ne sont plus en circulation. J'ai appris Smalltalk par curiosité de ce que j'en avais entendu pendant de nombreuses années. J'étais étonné de voir à quel point Ruby s'était levé de Smalltalk. Cela m'a amené à affiner certaines des façons dont je pense à la programmation dans les langues modernes. Je ne sais pas si vous avez essayé Smalltalk, mais c'est amusant. :) Si vous voulez vraiment choisir quelqu'un, allez voir la balise [pdp-11] (http://stackoverflow.com/questions/tagged/pdp-11). :) – lurker
Les programmeurs Smalltalk étaient largement respectés à cette époque dans le passé lointain. Quand interviewer pour des travaux en C++ ayant ST était presque un "ok vous êtes dedans" (par les programmeurs de ST que j'avais rencontrés). Je ne pensais pas qu'il était encore vivant, sauf dans des cas isolés de grandes installations de télécommunications. – javadba