Реализация psuedocode, использующая тот факт, что каждая часть строки должна быть словом, мы не можем ничего пропустить.Мы работаем вперед от начала строки до тех пор, пока первый бит не станет словом, а затем генерируем все возможные комбинации остальной части строки.Как только мы это сделаем, мы продолжим, пока не найдем другие возможности для первого слова и т. Д.
allPossibleWords(string s, int startPosition) {
list ret
for i in startPosition..s'length
if isWord(s[startPosition, i])
ret += s[startPostion, i] * allPossibleWords(s, i)
return ret
}
Ошибка в этом коде заключается в том, что в итоге вы будете повторять вычисления -в вашем примере вам придется рассчитать allPossibleWords("carrot")
дважды - один раз в ["forever", allPossibleWords["carrot"]]
и один раз в ["for", "ever", allPossibleWords["carrot"]]
.Так что запоминание это то, что нужно учитывать.