递归函数reverseDisplay1与reverseDisplay2实现:定义B含义解析
嘿,我来帮你把定义B的递归逻辑彻底搞清楚!你已经明白定义A是“先打最后一位,再递归处理前面的数”,那定义B刚好是另一种递归顺序——咱们用例子加代码一步步拆解:
首先,先把定义B再直白翻译一遍:
要显示一个数字的逆序,先逆序显示从左数第二位开始到末尾的所有数字,再显示原数字的左数第一位(最高位)
举个具体的例子,比如数字1234,按照定义B的步骤走:
- 先逆序显示“第二位及之后”的数字:也就是
234的逆序 - 等
234的逆序显示完,再显示原数字的第一位1
那234的逆序又会重复这个规则:
- 先逆序显示
34的逆序 - 再显示
2
34的逆序规则:
- 先逆序显示
4的逆序(就是4本身) - 再显示
3
把这些步骤串起来,最终输出就是4 → 3 → 2 → 1,和定义A的结果一样,但递归的执行顺序完全不同:A是先输出最后一位,再递归前面;B是先递归处理去掉最高位后的部分,最后才输出当前的最高位。
接下来看代码实现,我们需要先能获取“去掉最高位后的数字”,所以可以写个辅助函数计算数字的位数,然后用除法和取余来拆分最高位和剩余部分:
#include <stdio.h> #include <math.h> // 辅助函数:计算数字的位数 int countDigits(int value) { if (value == 0) return 1; // 处理0的特殊情况 int count = 0; while (value > 0) { count++; value /= 10; } return count; } // 定义B对应的递归函数 void reverseDisplay2(int value) { // 基准情况:如果是个位数,直接输出 if (value < 10) { printf("%d", value); return; } int digitCount = countDigits(value); int divisor = pow(10, digitCount - 1); // 用于拆分最高位的除数,比如1234的除数是1000 int firstDigit = value / divisor; // 取出最高位数字 int restOfDigits = value % divisor; // 取出第二位及之后的所有数字 // 第一步:先逆序显示剩余部分 reverseDisplay2(restOfDigits); // 第二步:再显示当前的最高位 printf("%d", firstDigit); } // 测试函数 int main() { printf("逆序显示1234:"); reverseDisplay2(1234); // 输出4321 printf("\n逆序显示5:"); reverseDisplay2(5); // 输出5 printf("\n逆序显示0:"); reverseDisplay2(0); // 输出0 return 0; }
我们再用1234走一遍递归调用栈的执行流程,更直观:
- 调用
reverseDisplay2(1234)→ 先调用reverseDisplay2(234),暂不输出1- 调用
reverseDisplay2(234)→ 先调用reverseDisplay2(34),暂不输出2- 调用
reverseDisplay2(34)→ 先调用reverseDisplay2(4),暂不输出3- 调用
reverseDisplay2(4)→ 基准情况,直接输出4
- 调用
- 回到
reverseDisplay2(34),输出3→ 当前输出:43
- 调用
- 回到
reverseDisplay2(234),输出2→ 当前输出:432
- 调用
- 回到
reverseDisplay2(1234),输出1→ 最终输出:4321
这样是不是就完全理解定义B的逻辑了?核心就是先递归处理去掉最高位后的子问题,再输出当前的最高位,和定义A的“先输出最低位,再递归处理前面的子问题”形成互补,虽然最终结果相同,但递归的执行顺序和输出时机完全不同。
内容的提问来源于stack exchange,提问作者Red
相关产品推荐
相关产品推荐

