Есть ли разница между использованием цикла while и оператора if внутри рекурсивной функции? - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь использовать рекурсивную функцию для отображения букв алфавита. Если я использую цикл while внутри функции, программа будет продолжаться вечно. Но если я использую оператор if внутри этой функции вместо цикла while, программа работает нормально. На мой взгляд, я думаю, что это одно и то же. Может кто-нибудь объяснить мне, что происходит?

#include<stdio.h>
void alpha(char c);
main()
{
    alpha('A');
}
void alpha(char c)
{
    while(c<='Z')
    {
        printf("%c",c);
        alpha(c+1);
    }
}
//This program never stops.

#include<stdio.h>
void alpha(char c);
main()
{
    alpha('A');
}
void alpha(char c)
{
    if(c<='Z')
    {
        printf("%c",c);
        alpha(c+1);
    }
}
//This works fine.

Для первого кода вывод: ABCDEFGHIJKLMNOPQRSTUVWXYZZZZZZZZ ......... (навсегда). Для второго кода вывод - ABCDEFGHIJKLMNOPQRSTUVWXYZ. Я ожидаю, что оба этих вывода будут одинаковыми.

Ответы [ 4 ]

2 голосов
/ 04 апреля 2019

Что происходит, когда первая версия вызывается с c='Z': то есть: alpha('Z')?В следующем коде:

while(c<='Z')        //Here you will loop forever because 'c' is not incremented
{
    printf("%c",c);  //This line will print 'Z'
    alpha(c+1);      //This line will call alpha('Z'+1) which will immediately
                     //return because the while loop in the next call frame 
                     //prevents further execution
}

Вот почему при вашем последнем рекурсивном вызове, когда c='Z', ваша программа продолжит печатать 'Z' навсегда.

Возможно, вы хотите

while(c<='Z')
{
    printf("%c",c);
    ++c;
}
1 голос
/ 04 апреля 2019

Тело блока if будет запущено только один раз при условии соблюдения условия, тогда как тело while будет работать несколько раз, пока условие выполняется.В этом случае:

while(c<='Z')
{
    printf("%c",c);
    alpha(c+1);
}

Вы в цикле проверяете значение c.Поскольку c никогда не меняется, цикл никогда не заканчивается.

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

0 голосов
/ 05 апреля 2019

Полагаю, вам нужен пробел после% c, это буфер.Каждый раз, когда вы используете цикл, вам нужен инкрементор.Оператор if запустится один раз и закроет программу, а цикл while будет продолжать работать бесконечно, пока не будет выполнено условие выхода.

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

void alpha(char c);
int main()
{
    alpha('A');
}
void alpha(char c)
{
    while (c != toupper('Z'))
    {
        printf("%c ", c);
        c++;
    }
    system("PAUSE");
}
0 голосов
/ 04 апреля 2019

вам не нужно вызывать рекурсивную функцию при вызове цикла while, и они будут работать точно так же, как код блока if

#include<stdio.h>
void alpha(char c);
main()
{
    alpha('A');
}
void alpha(char c)
{
    while(c<='Z')
    {
        printf("%c",c);
        c= c+1;
    }
}

Теперь о том, почему ваш код расширяется в бесконечном цикле, потому что, когда while(c<='Z') становится ложным после рекурсивных вызовов, он возвращается к предыдущему вызову (т. Е. Когда c=='Z'), и когда c никогда не увеличивается, он остается в бесконечном цикл.

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