c - 使用 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);
}
解决方案
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
,您将在任何递归级别中获得无限循环。
推荐阅读
- c - 如何使代码接受下一个单词而不仅仅是第一个单词?
- python-3.x - 如何在图像中找到对象的方向?
- javascript - window.open(url) 只用原始文本打开新窗口而不是下载
- pagination - Spring Data JDBC 的键集分页可分页
- javascript - 如何在反应 js 中将值推送到 url?
- c# - 从 Core 3.1 和 Standard 2.0 引用 EntityObject 的正确方法是什么
- amazon-web-services - 无法使用 Cognito 访问基于 nginx 的 AWS Kibana VPC
- sql - 创建易失性表和插入数据的问题 - teradata
- r - 寻找一个 R 函数来为 csv 中的每一行创建一个单独的 txt 文件
- pandas - Pandas:按每个基本级别的最近日期过滤具有多索引的数据框