Простая рекурсивная реализация.
SequenceableCollection>>allCombinations | first comb | self isEmpty ifTrue: [ ^self species with: self ]. first := self species with: self first. comb := (self copyFrom: 2 to: self size) allCombinations. ^(comb collect: [ :e | first , e ]) , comb
Пример использования:
comb := 'mama myla ramu' subStrings allCombinations reject: [ :e | e isEmpty ].
Получаем все непустые комбинации из слов в строке.