You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归函数问题:输入0时返回值异常的数字加1功能实现

解决C语言递归函数处理数字加1时输入0的异常问题

问题描述

需要实现一个C语言函数,将整数的每一位数字加1(若数字为9则保持不变)。当前递归函数对非0输入处理正常,但输入0时期望输出1;直接修改终止条件返回1会导致其他输入结果多一位前缀1,出现异常。

当前代码

int shift_digits(int n){
    if(n == 0){
        return 0;
    }else{
        int lastDigit = n % 10;
        if(lastDigit == 9){
            return 10 * shift_digits(n/10) + lastDigit;
        }else{
            return 10 * shift_digits(n/10) + lastDigit + 1;
        }
    }
}

问题根源

原函数的终止条件n == 0会触发两种场景:

  • 场景1:原始输入就是0,此时需要返回1
  • 场景2:递归处理完所有高位后,n被除至0,此时需要返回0(否则会给结果多添一个最高位的1)

直接修改终止条件返回1会同时影响两种场景,导致非0输入的结果异常。

解决方案

方案1:使用辅助递归函数

通过拆分主函数和辅助函数,分别处理原始输入的特殊情况和递归逻辑:

// 辅助函数:处理递归过程,仅在递归到n=0时返回0
static int helper(int num) {
    if (num == 0) {
        return 0;
    }
    int lastDigit = num % 10;
    if (lastDigit == 9) {
        return 10 * helper(num / 10) + lastDigit;
    } else {
        return 10 * helper(num / 10) + lastDigit + 1;
    }
}

// 主函数:处理原始输入为0的特殊情况
int shift_digits(int n) {
    if (n == 0) {
        return 1;
    }
    return helper(n);
}

方案2:添加初始调用标记参数

通过额外参数区分是否为初始调用,在递归过程中传递标记:

// 核心递归函数,is_initial标记是否为初始调用
int shift_digits_core(int n, int is_initial) {
    if (n == 0) {
        return is_initial ? 1 : 0;
    }
    int lastDigit = n % 10;
    if (lastDigit == 9) {
        return 10 * shift_digits_core(n / 10, 0) + lastDigit;
    } else {
        return 10 * shift_digits_core(n / 10, 0) + lastDigit + 1;
    }
}

// 对外暴露的包装函数,默认传递初始调用标记
int shift_digits(int n) {
    return shift_digits_core(n, 1);
}

测试验证

  • 输入0 → 输出1(符合预期)
  • 输入1234 → 输出2345(正常)
  • 输入8980 → 输出9991(正常)
  • 输入4278 → 输出5389(正常)

内容的提问来源于stack exchange,提问作者Declan Mitchell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:30:23