繁体   English   中英

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

[英]Using while loop vs if statement to reverse a string using recursion explanation

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

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

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

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

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


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

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

如果您没有在输入中提供与递归级别一样多的换行符,则整个递归的展开将卡住。

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

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

请注意,在这种情况下,output 会出现类似的错误。 它将仅打印 6 个换行符,因为附加的换行符会覆盖先前存储在每个递归级别的相应c变量中的字符。

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


除此之外,如果您收到输入错误并且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]);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM