递归菱形打印方法格式不符合JUnit测试预期问题求助
递归生成菱形字符串的格式问题修正
你的代码能生成正确数量的星号,但格式混乱的核心原因是中间最长行被重复打印,且递归返回后的下半部分逻辑没有正确区分中间行。当i == n时,递归终止后依然执行了后半段的循环代码,导致中间行出现两次;同时递归拼接的逻辑让下半部分的行被错误嵌套,最终排版错位。
修正后的代码
public static String printRhombus(int i, int n) { StringBuilder sb = new StringBuilder(); if (i > n) { return sb.toString(); } // 打印当前行(上半部分及中间行) for (int j = 0; j < (n - i) / 2; j++) { sb.append(" "); } for (int j = 0; j < i; j++) { sb.append("*"); } sb.append("\n"); // 递归打印下一行,直到中间行 if (i < n) { sb.append(printRhombus(i + 2, n)); // 打印当前行的镜像(下半部分,排除中间行) for (int j = 0; j < (n - i) / 2; j++) { sb.append(" "); } for (int j = 0; j < i; j++) { sb.append("*"); } sb.append("\n"); } return sb.toString(); }
关键改动说明
- 避免中间行重复:把下半部分的行打印逻辑移到
if (i < n)的判断内部,这样当i == n(中间最长行)时,不会重复输出该行。 - 保证对称顺序:递归调用完成后再打印当前行的镜像,确保下半部分是在上半部分(含中间行)全部打印完成后,按逆序输出对应行,完美实现上下对称。
测试示例
调用printRhombus(1, 5)会输出符合预期的菱形:
* *** ***** *** *
内容的提问来源于stack exchange,提问作者vivek patel
相关产品推荐
相关产品推荐

