递归实现字符串逆序打印的代码工作原理解析请求
递归实现字符串逆序打印的代码工作原理解析
嘿,我来帮你拆解这段递归代码的工作逻辑,其实递归的核心就是「自己调用自己」,咱们一步步捋清楚,保证你能明白:
首先先明确几个前提:
- C语言里的字符串是以
'\0'(空字符,ASCII值为0)作为结束标记的 _putchar是和标准库putchar功能一样的自定义函数,作用就是输出单个字符
函数核心逻辑拆解
咱们先看完整的函数结构:
void _print_rev_recursion(char *s) { if (*s > '\0') { _print_rev_recursion(s + 1); _putchar(*s); } }
1. 递归的「递」阶段:走到字符串的末尾
函数一开始会判断*s > '\0'——意思是当前指针s指向的字符不是结束符,是有效的字符串字符。
如果条件成立,先执行_print_rev_recursion(s + 1):这里s + 1是利用指针算术,把指针往后移动一位,指向字符串的下一个字符。
举个具体例子,假设传入的字符串是"hello":
- 第一次调用:
s指向'h',条件成立,调用自己,s变成指向'e' - 第二次调用:
s指向'e',条件成立,调用自己,s变成指向'l' - 第三次调用:
s指向'l',条件成立,调用自己,s变成指向'l' - 第四次调用:
s指向'l',条件成立,调用自己,s变成指向'o' - 第五次调用:
s指向'o',条件成立,调用自己,s变成指向'\0' - 第六次调用:
s指向'\0',*s > '\0'不成立,直接返回,「递」阶段结束
2. 递归的「归」阶段:从后往前打印字符
当走到字符串末尾(碰到'\0'),递归开始回溯,也就是从最后一次调用往回走,依次执行_putchar(*s):
- 回到第五次调用:
s指向'o',执行_putchar('o'),打印o,然后返回 - 回到第四次调用:
s指向'l',执行_putchar('l'),打印l,然后返回 - 回到第三次调用:
s指向'l',执行_putchar('l'),打印l,然后返回 - 回到第二次调用:
s指向'e',执行_putchar('e'),打印e,然后返回 - 回到第一次调用:
s指向'h',执行_putchar('h'),打印h,然后返回
最终输出就是olleh,完美实现了字符串的逆序打印!
关键知识点总结
- 递归终止条件:必须要有一个停止递归的条件,这里就是
*s等于'\0',否则会无限递归导致栈溢出 - 执行顺序的重要性:先递归调用再打印,才能实现逆序;如果先打印再递归,那就是正序输出了
- 指针移动:
s + 1是让指针每次往后跳一个字符,从而遍历整个字符串
备注:内容来源于stack exchange,提问作者Abdurrahman Kabir
相关产品推荐
相关产品推荐

