如何用递归在Java中实现数字金字塔图案(1 222 33333...)
嘿,我来帮你解决这两个数字金字塔的问题!
问题1:如何用数字制作金字塔图案?
数字金字塔的核心特点是:
- 第n行的数字个数是
2*n - 1(比如第1行1个,第2行3个,第3行5个,以此类推) - 整体要居中显示,所以每行开头需要打印「总层数 - 当前行号」个空格
给你一个Java非递归的实现例子,方便你理解基础逻辑:
public class NumberPyramid { public static void main(String[] args) { int totalRows = 5; // 金字塔的总层数 for (int row = 1; row <= totalRows; row++) { // 打印前置空格,实现居中 for (int space = 1; space <= totalRows - row; space++) { System.out.print(" "); } // 打印当前行的数字 for (int num = 1; num <= 2*row - 1; num++) { System.out.print(row); } // 换行进入下一行 System.out.println(); } } }
运行这个代码,你会得到这样的输出:
1 222 33333 4444444 555555555
问题2:修正递归实现的金字塔图案
我看了你的递归代码,问题主要出在两个地方:
- 你控制每行打印
row个数字,但我们需要的是2*row -1个 - 空格的判断逻辑有点偏差,导致居中效果不对
下面是修正后的递归代码,我会标注关键修改点:
public class RecursivePyramid { static void recursion(int row, int k, int j, int c) { if (row > c) { return; } else { // 修改点1:判断是否打印完当前行需要的数字(2*row-1个) if (k == 2 * row - 1) { System.out.println(); recursion(++row, 0, 0, c); } // 修改点2:空格数是c - row,打印到j等于这个数就停止 else if (j < c - row) { System.out.print(" "); recursion(row, k, ++j, c); } else { System.out.print(row); recursion(row, ++k, j, c); } } } public static void main(String[] args) { recursion(1, 0, 0, 5); // 调用递归,总层数设为5 } }
代码逻辑解释:
- 递归的终止条件还是
row > c,当所有行都打印完就退出 - 空格打印:第
row行需要c - row个前置空格,所以当j小于这个数时,持续打印空格 - 数字打印:每行需要打印
2*row -1个当前行号,所以当k计数到这个数时,换行并进入下一行的递归
运行修正后的代码,就能得到你想要的1 222 33333...这样的金字塔啦!
内容的提问来源于stack exchange,提问作者Abbas Yansaban
相关产品推荐
相关产品推荐

