Ручная трассировка рекурсивных функций
В приведенном выше вопросе с утвержденным ответом кажется, что
void string_permutation(string str, int mid, int end)
{
if (mid == end)
cout << str << endl;
else
{
for (int i = mid; i <= end; i++)
{
swap(str[mid], str[i]);
string_permutation(str, mid + 1, end);
swap(str[mid], str[i]);
}
}
}
Допустим, мы пытаемся выполнить следующее: ("abcd", 0, 3)
В соответствии с ответом, данным ранее, "bacd"
- это первое, на что изменяется строка, во время первого рекурсивного вызова (второго вызова функции), поэтому первый вызов + первый рекурсивный вызов выглядит следующим образом:
("abcd", 0, 3)
("bacd", 1, 3)
Однако, когда меня учили циклу for, было сказано, что содержимое цикла for выполняется до приращения (изменения индекса).
Что бы это значило, это то, что перед первым рекурсивным вызовом у нас есть int i = mid
, это означает mid == 0
и i == 0
, поэтому перестановка, происходящая непосредственно перед первым рекурсивным вызовом, такова:
swap(str[0], str[0]);
, что означает, что str, переданный рекурсивному вызову, по-прежнему ("abcd", 1, 3)
, по-прежнему abcd
Так почему верхний ответ в другом вопросе изменил строку на "bacd"
? Я что-то упускаю из-за петель? Какой из них, i
или mid
равен 1, или в их ответе есть ошибка?
Заранее спасибо.