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

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

本文详解 java 中嵌套循环计数器未重置导致迭代提前终止的根本原因,并提供两种可靠解决方案:修正版嵌套循环(含重置逻辑)与更简洁的单循环+模运算实现。

你遇到的问题非常典型——表面看是“循环没跑完”,实则是内层循环变量未在每次外层迭代开始时重置,导致 moveSet[1]、moveSet[

2] 和 moveSet[3] 在首次完整遍历后持续保持为 14,从而使对应 while 条件立即失败,后续迭代被跳过。

原始代码中,moveSet[3] 确实从 0 递增到 13(共 14 次),打印了 [0,0,0,0] 到 [0,0,0,13];但当 moveSet[3] 达到 14 后退出最内层循环,执行 moveSet[2]++ → 变为 1,此时 moveSet[3] 仍为 14(未归零!)。紧接着进入下一轮 while(moveSet[3]

✅ 正确做法:每次进入某一层循环前,必须将所有内层计数器显式重置为 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]++;
    }
}

该实现将严格输出全部 ^4 = 38,!416$ 种组合(如 [0,0,0,0], [0,0,0,1], …, [13,13,13,13]),符合预期。

? 更优雅的替代方案:使用单层 for 循环 + 进制分解逻辑。将四维索引视为一个以 14 为基数的四位数,通过整除与取模逐位提取每一位的值:

public static void iterateWithSingleLoop() {
    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));
    }
}

⚠️ 注意事项:

  • byte 类型范围是 -128 ~ 127,0~13 完全安全,但若将来扩展上限需注意溢出;
  • 嵌套循环易出错且难以维护,推荐单循环方案(逻辑清晰、无状态依赖、易于并行化);
  • 若组合维度动态变化(如数组长度不固定),应改用递归或迭代器模式,而非硬编码嵌套。

总结:嵌套循环的本质是“进位机制”,而手动模拟进位必须同步管理所有低位的归零行为。理解这一点,就能避免绝大多数多层循环计数陷阱。


# java  # 编码  # 字节  # for  # while  # 递归  # 循环  # 迭代  # 就能  # 首次  # 两种  # 遍历  # 而非  # 每一位  # 四位  # 但当 


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


相关推荐: 高端企业智能建站程序:SEO优化与响应式模板定制开发  WEB开发之注册页面验证码倒计时代码的实现  简单实现Android文件上传  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  如何在万网自助建站中设置域名及备案?  如何在云主机上快速搭建网站?  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  如何实现javascript表单验证_正则表达式有哪些实用技巧  如何快速上传建站程序避免常见错误?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何在Tomcat中配置并部署网站项目?  Linux安全能力提升路径_长期防护思维说明【指导】  济南网站建设制作公司,室内设计网站一般都有哪些功能?  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  如何用y主机助手快速搭建网站?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  Python函数文档自动校验_规范解析【教程】  手机软键盘弹出时影响布局的解决方法  如何在阿里云虚拟主机上快速搭建个人网站?  做企业网站制作流程,企业网站制作基本流程有哪些?  微信小程序 input输入框控件详解及实例(多种示例)  canvas 画布在主流浏览器中的尺寸限制详细介绍  使用豆包 AI 辅助进行简单网页 HTML 结构设计  b2c电商网站制作流程,b2c水平综合的电商平台?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  大连网站制作公司哪家好一点,大连买房网站哪个好?  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  nodejs redis 发布订阅机制封装实现方法及实例代码  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Python制作简易注册登录系统  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Firefox Developer Edition开发者版本入口  零服务器AI建站解决方案:快速部署与云端平台低成本实践  中山网站制作网页,中山新生登记系统登记流程?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  如何快速生成橙子建站落地页链接?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  如何在云虚拟主机上快速搭建个人网站?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  如何在服务器上三步完成建站并提升流量?  北京网站制作公司哪家好一点,北京租房网站有哪些?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践