Любопытный вопрос! Интересный код ката.
Я наивно думаю, что у меня есть рекурсивный метод, который принимает:
- список предметов, выбранных абонентом в данный момент
- набор предметов, доступных для вызываемого абонента
Метод будет перебирать набор, чтобы выбрать еще 1 элемент, и вызывать себя со списком, расширенным этим элементом, и набором, уменьшенным этим элементом. После возвращения удалите из списка, добавьте обратно в набор и переходите к следующему пункту (возьмите защитную копию набора курса).
Если текущий список пуст, выбранный первый элемент не может быть 0, согласно вашим правилам. Если вам нужно где-то собрать перестановки (а не просто распечатать), для коллекции или наблюдателя потребуется третий аргумент.
Рекурсия obvioulsy прекращается, когда доступный набор пуст, после чего перестановка отправляется в коллекцию или наблюдателю.
Если элементы могут повторяться, вы можете сначала отсортировать их, чтобы пропустить повторный выбор того же элемента в данной позиции.
Остерегайтесь, это требует глубины рекурсии N для N предметов. Но опасность минимальна, потому что даже при N = 10000 он может не быть переполнением стека, но время выполнения ЦП будет порядка (N!) (Вероятно, конец вселенной ...)