递归函数问题:输入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
相关产品推荐
相关产品推荐

