如何打印首尾元素不同的递增数字三角形图案

本文详解如何用嵌套循环生成每行起始与结束数字不相同的三角形数字图案,重点在于正确管理累加变量的作用域与更新时机,避免全局累加干扰行间独立性。

要实现如下目标图案:

1
3 5
5 8 11
7 11 15 19
9 14 1

9 24 29

关键在于:每行应拥有独立的起始值,并在该行内以固定步长(此处为当前 k 值)递增,且 k 在每行开始前自增一次,作为该行的“公差”。

? 错误根源分析

原代码中 p 是全局累加变量(p += k 跨行持续累加),且 k++ 发生在内层循环之后,导致:

  • 行间 p 值污染(如第2行从 p=1 继续加,而非重置);
  • k 的更新时机与行号错位,无法作为当行统一增量。

✅ 正确解法:行内局部初始化 + 行首预更新

核心策略是:

  • 将 p 声明为内层循环外、j 循环前的局部变量,确保每行独立初始化;
  • 在进入每行前,先更新 k(即 k++),再用其旧值(k-1)或新值设定该行起始点——本例采用 p = k++,即用当前 k 初始化 p,再立即递增 k,使 k 成为该行后续每次累加的步长。
int k = 0;
for (int i = 1; i <= 5; i++) {
    int p = k++; // ✅ 每行开始:p 取当前 k 值,k 自增为下一行步长
    for (int j = 1; j <= i; j++) {
        p += k; // ✅ 行内每次加的是「更新后的 k」(即本行公差)
        System.out.print(p + " ");
    }
    System.out.println();
}

? 执行过程简析(以前三行为例):

  • i=1:k=0 → p = 0, k 变为 1 → p += 1 → p=1 → 输出 1
  • i=2:k=1 → p = 1, k 变为 2 → p+=2→3;p+=2→5 → 输出 3 5
  • i=3:k=2 → p = 2, k 变为 3 → p+=3→5;p+=3→8;p+=3→11 → 输出 5 8 11

完全匹配期望输出。

? 进阶优化:对齐格式化输出

为提升可读性,推荐使用 printf 控制列宽,避免因数字位数增长导致错位:

int k = 0;
for (int i = 1; i <= 5; i++) {
    int p = k++;
    for (int j = 1; j <= i; j++) {
        p += k;
        System.out.printf("%-4d", p); // 左对齐,每数占4字符宽
    }
    System.out.println();
}

输出效果更整齐:

1   
3   5   
5   8   11  
7   11  15  19  
9   14  19  24  29  

⚠️ 注意事项总结

  • ❌ 避免将累加变量(如 p)声明在最外层循环外,否则会跨行累积,破坏行独立性;
  • ✅ k 的更新必须在每行开始时完成(如 p = k++),确保其作为该行增量基准的语义清晰;
  • ✅ 若需调整起始值或步长规律,只需修改 p 的初始赋值逻辑(例如 p = 2*k - 1 可让首项为奇数序列);
  • ? 调试时建议在关键位置添加 System.out.println("i="+i+", k="+k+", p="+p) 辅助验证状态流转。

掌握这一“行级状态隔离”思想,即可灵活构造各类非线性、分段递增的图案,是循环控制进阶的重要实践。