Я бы не стал индексировать, потому что это очень неэффективно. Скорее поверните список ввода и постройте список от начала до конца, получая результаты в обратном порядке. У вас есть текущий список, в который вы добавляете элементы с помощью cons
, который вы используете для добавления новых дополнений к результатам, и каждый уровень каждого существующего результата также получает один добавленный элемент.
В качестве параметров у вас есть состояние. Когда я делал ссылку, я использовал result
и cur
, и обычно моя итерация делалась так для (insert-everywhere 'd '(a b c))
:
lst cur results
(c b a) () ((d))
(b a) (c) ((d c) (c d))
(a) (b c) ((d b c) (b d c) (b c d))
() (a b c) ((d a b c) (a d b c) (a b d c) (a b c d)))
Теперь добавление поддержки для подсписков просто делает с ними то же самое, а затем создает карту так, что вы создаете один результат для каждого подсписка в результате, добавляя cur
в дополнение к добавлению его в качестве элемента.
Обратите внимание, что все новые результаты просто добавляются с добавленным вставленным элементом, и все остальные получают новый элемент во фронте, который является первым элементом ввода. cur
будет расти и будет использоваться совместно, поэтому только элементы до вставленного элемента будут уникальными для этого подрезультата.
У меня есть работающая реализация, но преждевременно получать решение преждевременно. Повеселись.