
本文讲解如何用纯递归方式判断一个正整数的每一位数字是否严格交替为奇数和偶数(如123、1234符合,12354不符合),并提供可直接运行的java实现,包含主函数与带状态传递的递归辅助函数。
要正确判断一个正整数是否满足“各位数字奇偶性严格交替”(即相邻两位一奇一偶,无连续奇或连续偶),关键在于递归过程中必须携带前一位数字的奇偶状态——而原始函数签名 isAlternatingNumber(int num) 不允许新增参数,因此需引入一个私有辅助递归函数(helper),通过额外布尔参数 isCurrentDigitEven 传递当前待校验位的奇偶性预期。
核心思路如下:
- 主函数 isAlternatingNumber 仅作入口适配:对单数字直接返回 true;对多位数,先提取最高位(实际是最后处理位)的奇偶性(注意:由于我们用 num / 10 和 num % 10 从低位向高位递归,此处“第一位”实为个位),再调用辅助函数,将剩余高位部分 num / 10 和个位奇偶性传入。
-
辅助函数 findIfAlternating 承担真正的递归逻辑:
- 每次取当前 num 的个位(即下一位待校验数字)→ num % 10,计算其奇偶性 isNextDigitEven;
- 利用 XOR 运算符 ^ 高效判断奇偶是否交替:isCurrentDigitEven ^ isNextDigitEven 在二者不同时为 true(即一奇一偶),相同时为 false(两奇或两偶);
- 递归继续:将高位截断后的数 num / 10 与当前位奇偶性 isNextDigitEven 作为新状态传入下一层;
- 终止条件:当 num
以下是完整可运行代码:
public class AlternatingChecker {
public static void main(String[] args) {
System.out.println("123: " + isAlternatingNumber(123)); // true → 3(odd),2(even),1(odd)
System.out.println("1234: " + isAlternatingNumber(1234)); // true → 4(even),3(odd),2(even),1(odd)
System.out.println("12354: " + isAlternatingNumber(12354)); // false → ...5(odd),3(odd) 连续奇
System.out.println("8: " + isAlternatingNumber(8)); // true → 单位数
System.out.println("24: " + isAlternatingNumber(24)); // false → 4(even),2(even) 连续偶
}
public static boolean isAlternatingNumber(int num) {
if (num < 10) return true;
// 以个位为起点:传入高位部分(num/10)和个位奇偶性
return findIfAlternating(num / 10, (num % 10) % 2 == 0);
}
private static boolean findIfAlternating(int num, boolean isCurrentDigitEven) {
boolean isNextDigitEven = (num % 10) % 2 == 0;
if (num < 10) {
return isCurrentDigitEven ^ isNextDigitEven;
}
return (isCurrentDigitEven ^ isNextDigitEven)
&& findIfAlternating(num / 10, isNextDigitEven);
}
}⚠️ 注意事项:
- 该解法按从低位到高位顺序检查(即个位→十位→百位…),逻辑上等价于从左到右遍历,因奇偶交替具有对称性;
- 切勿在主函数中直接递归比较 num%10 和 (num/10)%10——这会丢失中间位状态,且无法处理三位以上数字的跨位依赖;
- XOR 是本题关键:a ^ b 真值表天然匹配“奇偶不同则合法”的语义,比写 a != b 更符合位运算直觉(二者在布尔上下文中等价,但 ^ 更体现“异或”本质);
- 时间复杂度 O(d),d 为数字位数;空间复杂度 O(d)(递归栈深度)。
总结:当基础递归函数缺乏必要状态时,封装一个带参数的私有辅助函数是标准且优雅的解决方案。它既满足接口约束,又保证了逻辑完整性与可读性。










