在递归函数中使用while循环和if语句之间有区别吗?

时间:2019-04-04 18:25:13

标签: c recursion

我正在尝试使用递归函数来显示字母。如果我在函数内部使用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 个答案:

答案 0 :(得分:2)

使用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 :(得分:1)

if的主体将仅在满足条件的情况下运行一次,而while的主体将在条件为真的情况下运行多次。在这种情况下:

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

您正在循环检查c的值。由于c永远不会改变,因此循环永远不会结束。

您的第二个程序是处理递归函数的正确方法。除非满足某些条件,否则该函数将不会递归调用,如果满足,它将进行递归调用,然后在完成递归调用后返回。

答案 2 :(得分:0)

调用while循环时无需调用递归函数,它们将与if-block代码完全一样

it 'sample test', ()->
    await Promise.resolve 0
    await Promise.resolve 0
    .then ->
        // do stuff here

现在,为什么代码在无限循环中进行扩孔是因为,当#include<stdio.h> void alpha(char c); main() { alpha('A'); } void alpha(char c) { while(c<='Z') { printf("%c",c); c= c+1; } } 在递归调用之后变为false时,它将返回到先前的调用(即,当while(c<='Z')时),并且返回为c=='Z'永不递增,它保持无限循环。

答案 3 :(得分:0)

我相信您在%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");
}