Думайте о рекурсии как о просто ряде уровней. На каждом уровне вы выполняете фрагмент кода, здесь вы выполняете цикл for n-i раз на каждом уровне. это окно уменьшается на каждом уровне. n-i раз, n- (i + 1) раз, n- (i + 2) раза, .. 2,1,0 раза.
Что касается манипулирования и перестановки строк, думайте о строке как о «наборе» символов. "abcd" как {'a', 'b', 'c', 'd'}. Перестановка переставляет эти 4 пункта всеми возможными способами. Или как выбрать 4 пункта из этих 4 пунктов разными способами. В перестановках порядок имеет значение. abcd отличается от acbd. мы должны генерировать оба.
Предоставленный вами рекурсивный код именно так и делает. В моей строке выше "abcd" ваш рекурсивный код выполняет 4 итерации (уровня). В первой итерации у вас есть 4 элемента на выбор. вторая итерация, у вас есть 3 элемента на выбор, третьи 2 элемента и так далее. так что ваш код работает 4! расчеты. Это объясняется ниже
First iteration
:
выберите символ из {a, b, c, d}
Second Iteration
:
выберите символ из вычтенного множества {{a, b, c, d} - {x}}, где x - символ, выбранный из первой итерации. то есть, если «a» было выбрано на первой итерации, эта итерация может выбирать из {b, c, d}.
Third Iteration
:
выберите символ из вычтенного множества {{a, b, c, d} - {x, y}}, где x и y - выбранные символы из предыдущих итераций. то есть, если на первой итерации выбрано «а», а на 2-й выбрано «с», то здесь нам нужно поиграть {b, d}.
Это повторяется, пока мы не выберем 4 символа в целом. Как только мы выбираем 4 возможных символа, мы печатаем символы. Затем вернитесь назад и выберите другого персонажа из возможного набора. т.е. когда мы возвращаемся к третьей итерации, мы выбираем следующий из возможных наборов {b
, d}. Таким образом, мы генерируем все возможные перестановки данной строки.
Мы выполняем этот набор манипуляций, чтобы мы не выбирали одни и те же символы дважды. то есть abcc, abbc, abbd, bbbb недействительны.
Оператор swap в вашем коде выполняет эту конструкцию набора. Он разбивает строку на два набора free set
на выбор used set
, которые уже используются. Все символы слева i+1
равны used set
, а справа free set
. На первой итерации вы выбираете среди {a, b, c, d} и затем передаете {a}: {b, c, d} на следующую итерацию. Следующая итерация выбирает одну из {b, c, d} и передает {a, b}: {c, d} на следующую итерацию и так далее. Когда элемент управления вернется к этой итерации, вы выберете c
и создадите {a, c}, {b, d}, используя обмен.
Это концепция. В противном случае, рекурсия здесь проста, она работает на глубину n, а каждый уровень запускает цикл n, n-1, n-2, n-3 ... 2,1 раза