Я ищу алгоритм для создания перестановок набора таким образом, чтобы я мог составить ленивый список из них в Clojure. т.е. я хотел бы перебирать список перестановок, где каждая перестановка не вычисляется до тех пор, пока я ее не запрошу, и все перестановки не должны быть сохранены в памяти сразу.
В качестве альтернативы я ищу алгоритм, в котором задан определенный набор, он вернет "следующую" перестановку этого набора таким образом, что повторное вызов функции на своем собственном выходе будет циклически перемещаться по всем перестановкам оригинала set, в некотором порядке (какой порядок не имеет значения).
Есть ли такой алгоритм? Большинство алгоритмов генерации перестановок, которые я видел, имеют тенденцию генерировать их сразу (обычно рекурсивно), что не масштабируется до очень больших наборов. Реализация в Clojure (или другом функциональном языке) была бы полезна, но я могу понять ее из псевдокода.