c-使用while循环vs if语句使用递归解释来反转字符串



所以我无法理解在这个程序中使用if语句反转字符串的逻辑,while循环不应该类似地执行任务吗?但当你用while((c=getchar())!='n')替换if((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);
}
if ((c = getchar()) != 'n') {
wrt_t();
}

如果使用if语句,则每次递归只提取一个字符。如果它不是换行符(n(,它将进入下一个最深的递归级别,并且在该级别中提取的字符尚未打印。

当最终到达输入中提供的换行符时,输入字符的顺序将被反向打印,因为最深(最后(递归级别首先打印其提取的字符,顺序也会一直到最高递归级别。

在每个更高的递归级别中,除了打印在该递归级别提取的字符并返回到下一个最高递归级别之外,没有什么可做的了。

结果是字符的输入,直到以相反的顺序找到第一个换行符为止。


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

当使用while循环时,行为会有所不同。最后到达最深递归级别的换行符后,它将打印输入的最后一个字符(在该最后一个递归级别提取的字符(,返回到下一个最高递归级别并迭代相应的while循环,直到它在输入中找到另一个换行符以脱离循环并返回到下个最高递归级。

如果在输入中没有提供与递归级别一样多的换行符,那么整个递归的展开将陷入困境。

例如,对于像"hello"这样的5个字符的输入,您需要6个尾随换行符才能退出递归:

hellonnnnnn

请注意,在这种情况下,输出将是类似的错误。它将只打印6个换行符,因为附加的换行符将被覆盖预先存储在各个递归级别的相应CCD_ 8变量中的字符。

在您的情况下,如果它只得到一个换行符,它将只打印从最深递归级别获取的输入的最后一个字符(实际上是换行符(,并等待更多的输入。


除此之外,如果您得到一个输入错误,并且getchar()返回EOF,您将在任何递归级别中得到一个无休止的循环。

在您的代码中,变量c既不是数组也不是指针,因此您无法在其中存储所有字符。

一旦c将一个字符存储为输入,如果再次声明,则新输入将与前一个重叠。

所以最后存储在变量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]);
}

最新更新