如何用递归判断一个正整数的各位数字是否严格交替奇偶
发布时间 - 2026-01-04 00:00:00 点击率:次本文讲解如何用纯递归方式判断一个正整数的每一位数字是否严格交替为奇数和偶数(如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.pri
ntln("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)(递归栈深度)。
总结:当基础递归函数缺乏必要状态时,封装一个带参数的私有辅助函数是标准且优雅的解决方案。它既满足接口约束,又保证了逻辑完整性与可读性。
# java
# git
# 栈
# ai
# 递归函数
# java实现
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
浅谈redis在项目中的应用
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
如何基于云服务器快速搭建网站及云盘系统?
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
敲碗10年!Mac系列传将迎来「触控与联网」双革新
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
千库网官网入口推荐 千库网设计创意平台入口
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
如何用西部建站助手快速创建专业网站?
深圳网站制作平台,深圳市做网站好的公司有哪些?
Laravel中的withCount方法怎么高效统计关联模型数量
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
javascript中对象的定义、使用以及对象和原型链操作小结
BootStrap整体框架之基础布局组件
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
如何在云服务器上快速搭建个人网站?
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
如何快速配置高效服务器建站软件?
Laravel怎么实现验证码(Captcha)功能
重庆市网站制作公司,重庆招聘网站哪个好?
昵图网官方站入口 昵图网素材图库官网入口
如何在IIS服务器上快速部署高效网站?
如何快速查询网址的建站时间与历史轨迹?
Laravel如何使用Service Container和依赖注入?(代码示例)
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
如何用景安虚拟主机手机版绑定域名建站?
LinuxShell函数封装方法_脚本复用设计思路【教程】
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
,交易猫的商品怎么发布到网站上去?
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
如何在阿里云高效完成企业建站全流程?
长沙企业网站制作哪家好,长沙水业集团官方网站?
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
Laravel如何配置任务调度?(Cron Job示例)
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
Python数据仓库与ETL构建实战_Airflow调度流程详解
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
高防服务器租用首荐平台,企业级优惠套餐快速部署
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
如何用PHP快速搭建高效网站?分步指南


ntln("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);
}
}