如何正确实现四层嵌套循环遍历所有字节数组组合

发布时间 - 2026-01-28 00:00:00    点击率:

本文详解为何原始嵌套循环仅输出14次结果,并提供两种可靠解决方案:修复重置逻辑的嵌套循环与更简洁的单循环+模运算实现。

你遇到的问题非常典型——表面看是四层 while 循环,本应穷举 14⁴ = 38,416 种组合(每个 byte 元素取值 0 到 13),但实际只打印了 14 行,且全部集中在 [0, 0, 0, x](x 从 0 到 13)。根本原因在于:内层循环变量未在每次外层迭代开始时重置为 0

在你的原始代码中,moveSet[1]、moveSet[2] 和 moveSet[3] 一旦递增到 14 并退出对应 while 循环后,其值就永久停留在 14,后续外层循环再次进入时,内层条件(如 moveSet[1]

✅ 正确做法:每次进入某一层循环前,显式将所有内层索引重置为 0。修正后的嵌套结构如下:

public static void iterateThroughMoves() {
    byte[] moveSet = {0, 0, 0, 0};

    while (moveSet[0] < 14) {
        moveSet[1] = 0; // ← 关键:重置第2位
        while (moveSet[1] < 14) {
            moveSet[2] = 0; // ← 关键:重置第3位
            while (moveSet[2] < 14) {
                moveSet[3] = 0; // ← 关键:重置第4位
                while (moveSet[3] < 14) {
                    System.out.println(Arrays.toString(moveSet));
                    moveSet[3]++;
                }
                moveSet[2]++;
            }
            moveSet[1]++;
        }
        moveSet[0]++;
    }
}

⚠️ 注意事项:

  • 重置语句必须放在对应 while 循环内部、紧邻循环条件之前(如 moveSet[1] = 0 放在 while (moveSet[1]
  • byte 类型虽可表示 -128 到 127,但此处用作非负计数器(0–13)完全安全,无需担心溢出;
  • 若数组长度动态变化(如支持 n 位组合),建议改用递归或迭代式进位算法,避免硬编码多层嵌套。

? 更优雅的替代方案:使用单层 for 循环 + 模运算,将四维组合映射为一维索引,代码更简洁、易扩展、无重置疏漏风险:

public static void iterateThroughMovesCompact() {
    

int total = 14 * 14 * 14 * 14; // 38416 for (int i = 0; i < total; i++) { byte[] moveSet = new byte[4]; moveSet[3] = (byte) (i % 14); // 个位(最低位) moveSet[2] = (byte) ((i / 14) % 14); // 十位 moveSet[1] = (byte) ((i / 14 / 14) % 14); // 百位 moveSet[0] = (byte) ((i / 14 / 14 / 14) % 14); // 千位(最高位) System.out.println(Arrays.toString(moveSet)); } }

? 总结:嵌套循环的“重置”是初学者高频陷阱。记住口诀:外层每进一次,内层全归零。而模运算法本质是将 base-14 的四进制数逐位分解,兼具可读性与健壮性,推荐在组合枚举场景优先采用。


# 编码  # 字节  # for  # while  # 递归  # 循环  # 算法  # 放在  # 穷举  # 迭代  # 两种  # 停留在  # 本应  # 根本原因  # 四层  # 百位 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  打造顶配客厅影院,这份100寸电视推荐名单请查收  Laravel如何使用Gate和Policy进行授权?(权限控制)  如何在云虚拟主机上快速搭建个人网站?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  高端网站建设与定制开发一站式解决方案 中企动力  网站制作价目表怎么做,珍爱网婚介费用多少?  Laravel如何实现一对一模型关联?(Eloquent示例)  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  php 三元运算符实例详细介绍  JS经典正则表达式笔试题汇总  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  如何用IIS7快速搭建并优化网站站点?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  javascript中对象的定义、使用以及对象和原型链操作小结  网站制作免费,什么网站能看正片电影?  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  iOS中将个别页面强制横屏其他页面竖屏  Laravel中的Facade(门面)到底是什么原理  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  Laravel怎么在Controller之外的地方验证数据  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  Laravel如何配置Horizon来管理队列?(安装和使用)  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Laravel怎么使用artisan命令缓存配置和视图  详解Android图表 MPAndroidChart折线图  怎么用AI帮你为初创公司进行市场定位分析?  Python高阶函数应用_函数作为参数说明【指导】  Laravel如何与Inertia.js和Vue/React构建现代单页应用  Thinkphp 中 distinct 的用法解析  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  济南网站建设制作公司,室内设计网站一般都有哪些功能?  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  Laravel如何处理文件下载请求?(Response示例)  Laravel如何实现API资源集合?(Resource Collection教程)  音响网站制作视频教程,隆霸音响官方网站?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  Python文件操作最佳实践_稳定性说明【指导】  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  网站建设整体流程解析,建站其实很容易!