递归反转句子中char变量存储机制与字符迭代原理问询
递归反转句子的char变量疑问解答
核心先明确:这段代码根本没存整个字符串
你定义的char sentence;是单个字符变量,不是字符串。字符串需要用char[](字符数组)或者char*(字符指针)来存,但这里的逻辑是靠递归的栈帧,把每个字符分开存到每一层调用的单独变量里,最后回溯输出实现反转。
1. 为什么不用方括号/大括号也能处理字符串?
方括号是用来定义字符数组(存多个字符)的,而这里的char sentence每次只存一个输入的字符。整个字符串并没有被一次性存储,而是:
- 每调用一次
swap_recursion(),就会在栈上创建一个属于当前层的sentence变量,存刚读的那个字符; - 这些变量各自独立,直到递归触底(读到
\n),才会从最后一层开始依次输出每个sentence里的字符,拼起来就是反转后的句子。
2. 它是怎么“遍历”下一个字符的?
这里没有用for/while循环迭代,全靠递归的调用顺序实现:
- 第一次调用
swap_recursion(),scanf读第一个字符,比如输入hello\n,第一个字符是h; - 因为
h不是换行符,立刻递归调用自身,读第二个字符e; - 重复这个过程,直到某次
scanf读到\n,这时条件不满足,当前层递归直接结束; - 开始回溯:回到上一层(存着
o的那层),执行printf输出o; - 再回到上一层(存着
l的那层),输出l; - 以此类推,直到回到最开始的第一层,输出
h,最终得到olleh。
简单说,递归的栈就像叠盘子,每读一个字符叠一个,碰到换行就从最上面的盘子开始挨个拿出来,自然就反转了。
附上你的代码方便对照:
#include <stdio.h> void swap_recursion(); int main() { printf("Input a sentence: "); swap_recursion(); return 0; } void swap_recursion(){ char sentence; scanf("%c", &sentence); if (sentence != '\n'){ swap_recursion(); printf("%c", sentence); } }
内容的提问来源于stack exchange,提问作者Snowie
相关产品推荐
相关产品推荐

