Чтобы понять этот код, давайте сначала посмотрим на нереверсивную версию:
void reverseSentence() {
char c;
scanf("%c", &c);
if (c != '\n')
{
printf("%c",c);
reverseSentence();
}
}
Он читает один символ из стандартного ввода, и если этот символ не является новой строкой,пишет обратно.Затем вместо явного зацикливания он неявно зацикливается через рекурсию, чтобы прочитать и напечатать следующий символ:
local> echo "The elephants are coming!" | ./a.out
The elephants are coming!local>
Функция читает и печатает один символ в каждой рекурсии.Теперь, если мы изменим порядок этих двух строк, как в оригинале:
reverseSentence();
printf("%c",c);
То же самое произойдет, за исключением того, что теперь мы обрабатываем следующий символ перед обработкой текущего:
local> echo "The elephants are coming!" | ./a.out
!gnimoc era stnahpele ehTlocal>
Все еще считывает и записывает один символ в каждой рекурсии, но использует тот факт, что повторение сначала, а затем обработка текущего элемента обрабатывает данные в обратном порядке.Обрабатывает текущий элемент, а затем восстанавливает данные в прямом порядке.