You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

递归实现非负整数反转(禁止使用字符串、循环及其他函数)

递归实现非负整数反转(禁止使用字符串、循环及其他函数)

嘿,我来帮你搞定这个递归反转非负整数的问题!先明确下咱们的核心要求:实现int reverse(int n)函数,必须用纯递归,绝对不能碰字符串、循环,也不能调用其他任何辅助函数(包括标准库函数),而且输入都是非负整数对吧?

先把规则再理一遍:

  • 输入非负整数,返回其数字反转后的整数
  • 必须使用递归实现
  • 禁止使用字符串、循环或任何其他辅助函数
  • 可假设输入数字 n >= 0

给你看两个典型示例:

输入: 12345 输出: 54321
输入: 100 输出: 1

思路拆解

递归的核心就是把大问题拆成更小的子问题。比如反转12345,我们可以拆成:把最后一位5放到最前面,然后反转剩下的1234,再把这两部分组合起来。但这里有个关键问题:怎么知道要把5乘以多少才能放到最前面?比如1234是4位数,所以5要乘以10^4(也就是10000),再加上反转1234的结果4321,就能得到54321。

这就拆出了两个小的递归任务:

  1. 递归反转当前数去掉最后一位后的部分
  2. 递归计算去掉最后一位后的数的位数,进而得到需要乘的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);
}

代码验证

咱们拿示例来跑一遍:

  • 输入100reverse(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

火山引擎 最新活动