само создающихся циклов
Вероятно, вас интересует
рекурсия.
Один из алгоритмов получения всех перестановок использует рекурсивный вызов функции.
Логика такая: на первой позиции может побывать каждая из букв. На остальных – все перестановки оставшихся.
Например, взяли первую
'a'
и остался массив на 1 короче:
['b', 'c', 'd']
С этим укороченным подход точно такой же, как с исходным: на 1-й позиции по очереди каждая. И ротация оставшихся двух. Для двух — то же самое. Т.е. это реализуется одной и той же функцией, только на входе массивы разной длины.
И в конце цепочки вызовов на вход приходит массив с единственным символом – тут сразу возвращается он.
Другой интересный алгоритм перебора всех перестановок, без рекурсии —
алгоритм Нарайаны. Он для каждой комбинации однозначно «знает» следующую.