Использование оператора while l oop vs if для переворота строки с использованием объяснения рекурсии - PullRequest
1 голос
/ 14 июля 2020

Итак, я не могу понять logi c для использования оператора if для переворота строки в этой программе, не должно ли while l oop выполнять задачу аналогично, но когда вы заменяете if((c=getchar())!='\n') на while((c=getchar())!='\n') печатает только последний символ строки. Мне нужна помощь в том, как эта рекурсия работает по-разному в этих двух случаях.

    #include <stdio.h>
void wrt_t(void);
int main(void)
{
    wrt_t();
    putchar('\n');
    return 0;
}

void wrt_t(void){
    int c;
    if((c=getchar())!='\n'){
            wrt_t();
    }
            
    putchar(c);
}

Ответы [ 2 ]

2 голосов
/ 14 июля 2020
if ((c = getchar()) != '\n') {
      wrt_t();
}

Если вы используете оператор if, для каждой рекурсии будет выбираться только один символ. Если это не новая строка (\n), она переходит на следующий самый глубокий уровень рекурсии, и на этом выбранном уровне символ еще не печатается.

Когда, наконец, достигается новая строка, указанная во вводе , порядок вводимых символов будет напечатан в обратном порядке, так как самый глубокий (последний) уровень рекурсии сначала печатает свой выбранный символ, и, таким образом, идет порядок до самого высокого уровня рекурсии.

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

Результатом является ввод символов до тех пор, пока первая новая строка не будет найдена в обратном порядке заказ.

while ((c = getchar()) != '\n') {
      wrt_t();
}

Когда вы используете while l oop, поведение другое. После того, как новая строка будет наконец достигнута на самом глубоком уровне рекурсии, он напечатает последний символ ввода (символ, полученный на этом последнем уровне рекурсии), вернется на следующий самый высокий уровень рекурсии и выполнит итерацию соответствующего while l oop пока он не найдет другой символ новой строки во входных данных, чтобы выйти из l oop и вернуться на следующий самый высокий уровень рекурсии.

Если вы не предоставляете столько новых строк, сколько уровней рекурсии во входных данных, всей рекурсии застрянет.

Например, для ввода 5 символов, таких как "hello", вам потребуется 6 завершающих символов новой строки, чтобы выйти из рекурсии:

hello\n\n\n\n\n\n

Обратите внимание, что в этом случае вывод был бы таким же неправильным. Он будет печатать только 6 новых строк, так как добавленные новые строки перезаписывают символы, сохраненные ранее в соответствующей переменной c на каждом уровне рекурсии.

В вашем случае, если он получает только одну новую строку, он будет печатать только последний символ (на самом деле символ новой строки) ввода, который был извлечен на самом глубоком уровне рекурсии, и дождитесь ввода дополнительных данных.

Кроме того, если вы получили ошибку ввода и getchar() вернули EOF, вы получите бесконечное l oop на любом из уровней рекурсии.

0 голосов
/ 14 июля 2020

В вашем коде переменная c не является ни массивом, ни указателем , поэтому вы не можете хранить в ней все символы.

Однажды c сохраняет символ как input, и если он снова будет объявлен, то новый ввод будет перекрывать предыдущий .

Итак, в конце то, что хранится в переменной c, является только последним символом.

Вот как это можно сделать:

#include <stdio.h>
#include <stdlib.h>

//function declarations
int getInput();
void print_reverse_input(int i,char* str);

//global declarations
int i=0;
char c;
char str[20];
int main()
{
    int p;
    p= getInput();
    print_reverse_input(p,str);
    return 0;
}
int getInput()
{
    if((c=getchar())!='\n')
    {
        str[i]=c;
        ++i;
        getInput();
    }
    return i;
}
void print_reverse_input(int i,char* str)
{
    int j;
    for(j=i;j>=0;j--)
    printf("%c",str[j]);
}
...