让我在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