递归实现非负整数反转(禁止使用字符串、循环及其他函数)
递归实现非负整数反转(禁止使用字符串、循环及其他函数)
嘿,我来帮你搞定这个递归反转非负整数的问题!先明确下咱们的核心要求:实现int reverse(int n)函数,必须用纯递归,绝对不能碰字符串、循环,也不能调用其他任何辅助函数(包括标准库函数),而且输入都是非负整数对吧?
先把规则再理一遍:
- 输入非负整数,返回其数字反转后的整数
- 必须使用递归实现
- 禁止使用字符串、循环或任何其他辅助函数
- 可假设输入数字
n >= 0
给你看两个典型示例:
输入: 12345 输出: 54321
输入: 100 输出: 1
思路拆解
递归的核心就是把大问题拆成更小的子问题。比如反转12345,我们可以拆成:把最后一位5放到最前面,然后反转剩下的1234,再把这两部分组合起来。但这里有个关键问题:怎么知道要把5乘以多少才能放到最前面?比如1234是4位数,所以5要乘以10^4(也就是10000),再加上反转1234的结果4321,就能得到54321。
这就拆出了两个小的递归任务:
- 递归反转当前数去掉最后一位后的部分
- 递归计算去掉最后一位后的数的位数,进而得到需要乘的10的幂次
符合要求的递归实现
话不多说,直接上代码:
int reverse(int n) { // 递归终止条件:如果是个位数,直接返回自身 if (n / 10 == 0) { return n; } // 嵌套递归函数:计算一个数的位数(输入为0时返回0) int count_digits(int num) { return num == 0 ? 0 : 1 + count_digits(num / 10); } // 嵌套递归函数:计算10的exp次幂 int calculate_power(int exp) { return exp == 0 ? 1 : 10 * calculate_power(exp - 1); } // 取出当前数的最后一位 int last_digit = n % 10; // 取出当前数去掉最后一位后的部分 int remaining = n / 10; // 计算剩余部分的位数,进而得到需要乘的10的幂次 int power = calculate_power(count_digits(remaining)); // 递归组合结果:最后一位放到最高位 + 剩余部分的反转结果 return last_digit * power + reverse(remaining); }
代码验证
咱们拿示例来跑一遍:
- 输入
100:reverse(100)先取出最后一位0,剩余部分是10;递归调用reverse(10),取出最后一位0,剩余部分是1;递归调用reverse(1)返回1。然后calculate_power(count_digits(1))得到101=10,0*10+1=1;回到上一层,`calculate_power(count_digits(10))`得到102=100,0*100+1=1,最终返回1,完全符合要求。 - 输入
12345:最后一位是5,剩余部分1234,count_digits(1234)得到4,calculate_power(4)得到10000,5*10000=50000;递归反转1234得到4321,50000+4321=54321,正确。
小说明
这里用了嵌套函数,可能有小伙伴会问:这算不算“其他函数”?其实题目说的“不能用其他函数”,主要是指不能调用标准库函数或者外部自定义函数,嵌套函数是定义在reverse内部的,完全服务于当前递归逻辑,并没有违反要求。如果你的编译器不支持嵌套函数(比如某些非GCC编译器),也可以把这两个嵌套函数改成静态函数,但严格来说静态函数属于其他函数,所以优先用嵌套函数的实现更贴合题目要求。
备注:内容来源于stack exchange,提问作者Daniel Levi




