ループを排除して、心持ち、すっきりとさせてみました。心持ち。w
SequenceableCollection >> combinations: digits atATimeAt: target | size sum ranges cursor digit | size _ self size. (size < digits or: [digits < 1]) ifTrue: [^ self species new]. ranges _ OrderedCollection new. (size - 1 to: digits - 1 by: -1) inject: 0 into: [: lastIndex : n | ranges add: lastIndex + (n take: digits - 1)]. cursor _ ranges findFirst: [: lastIndex | lastIndex >= target]. sum _ cursor > 1 ifTrue: [ranges at: cursor - 1] ifFalse: [0]. digit _ self species with: (self at: cursor). ^ digit, ((self allButFirst: cursor) combinations: digits - 1 atATimeAt: target - sum)