Обращение строки с использованием критериев выхода из рекурсии - PullRequest
0 голосов
/ 27 февраля 2019
void reverseSentence() 
{ 
    char c; 
    scanf("%c", &c); 

    if(c != '\n') 
    { 
        reverseSentence(); 
        printf("%c", c); 
    } 
}

Чего я здесь не понимаю, так это если функция рекурсии вызывается снова и снова, когда элемент управления переходит к функции print и печатает стек вызовов?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Чтобы понять этот код, давайте сначала посмотрим на нереверсивную версию:

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>

Все еще считывает и записывает один символ в каждой рекурсии, но использует тот факт, что повторение сначала, а затем обработка текущего элемента обрабатывает данные в обратном порядке.Обрабатывает текущий элемент, а затем восстанавливает данные в прямом порядке.

0 голосов
/ 27 февраля 2019

Когда функция вызывает себя, printf просто удерживается, пока не будет выполнена вызванная функция.

При вводе «Hi \ n» это будет выглядеть так:

scanf -> H
reverseSentence()
    scanf -> i
    reverseSentence()
        scanf -> \n
        return
    printf -> i
    return
printf -> H
return

Прохождение через отладчик может помочь вам понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...