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



我正在尝试使用递归函数来显示字母表中的字母。如果我在函数中使用 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.

对于第一个代码,输出是 ABCDEFGHIJKLMNOPQRSTUVWXYZZZZZZZZZZZZ......(永远(。对于第二个代码,输出是 ABCDEFGHIJKLMNOPQRSTUVWXYZ。我希望这两个输出是相同的。

当第一个版本被调用时会发生什么 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;
}

如果满足条件,if块的主体只会运行一次,而while的主体在条件为真时将运行多次。 在这种情况下:

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

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

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

当你

调用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')在递归调用后变为 false 时,它将返回到之前的调用(即当c=='Z'时(,并且由于c永远不会递增,它仍然处于无限循环中。

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

最新更新