首页 > 解决方案 > 使用 while 循环 vs if 语句使用递归解释来反转字符串

问题描述

所以我无法理解在这个程序中使用 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);
}

标签: cstringif-statementrecursionwhile-loop

解决方案


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

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

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

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

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


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

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

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

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

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

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

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


除此之外,如果您收到输入错误并getchar()返回EOF,您将在任何递归级别中获得无限循环。


推荐阅读