Обратное предложение с использованием putchar () в рекурсивной функции - PullRequest
1 голос
/ 06 августа 2020

Я вошел в этот код, читая какой-то слайд, просто код без объяснений, и я не могу понять, как работает функция invertSeq. Особенно то, что getchar () не запрашивает никаких входных данных во время итерации функции.

#include <stdio.h>

void invertSeq(void);

int main() {
    printf("Insert seq: \n");
    invertSeq();
    return 0;
}

void invertSeq(void){
    int c;
    c = getchar();
    if(c == '\n'){
        printf("Inverted seq: ");
        return;
    }
    invertiSeq();
    putchar(c);
    return;
}

1 Ответ

0 голосов
/ 07 августа 2020

Я постараюсь объяснить это как можно проще: когда функция в программе C вызывает другую функцию (даже саму себя), она должна «ждать», пока функция, которую она вызвала, завершила sh выполнение своего код перед продолжением выполнения оставшихся инструкций. Итак, в этом случае:

1. void invertSeq(void){
2.        int c;
3.       c = getchar();
4.        if(c == '\n'){
5.           printf("Inverted seq: ");
6.           return;
7.       }
8.        invertiSeq();
9.        putchar(c);
10.        return;
11.   }

Когда invertSeq() вызывается main(), выполняются инструкции в строках 2-7, а затем вызывается invertSeq(). В это время был прочитан первый символ из ввода, и, если этот символ не \n, то вызывается invertSeq() (в строке 8). Прежде чем инструкции в строках 9 и 10 будут выполнены, недавно вызванный invertSeq() должен выполнить свои инструкции. Теперь, если следующий символ из ввода не \n, то снова вызывается invertSeq() (имейте в виду, что в этот момент второй символ из ввода был прочитан). Этот процесс, во время которого invertSeq() вызывает себя несколько раз в строке 8 после выполнения инструкций из предыдущих строк, повторяется до тех пор, пока \n не будет считан из ввода. Когда это происходит, «последний» вызванный invertSeq() (тот, который читает \n из ввода) выполняет инструкции в строках 5 и 6 и, таким образом, печатает «Inverted seq:» и завершает работу. Вызываемый «предпоследний» invertSeq() (тот, который читает последний символ строки) печатает последний символ, выполняя putchar(c) в строке 9, и завершается после выполнения return; в строке 10. Этот процесс продолжается до «каждого». invertSeq() выполняет инструкции в строках 9 и 10, таким образом печатая символы строки в обратном порядке.

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