递归生成钻石序列时,如何设置正确的前置空格数?
解决递归钻石序列居中问题的思路与修正代码
问题根源分析
你的代码核心问题在于递归层级的前置空格控制逻辑错误:当前仅在递归调用前后打印单个空格,但实际上每一层n-1的钻石需要整体向右偏移n-1个空格(相对于n级钻石的位置),而非逐行加1个空格。同时,单个钻石内部的行偏移计算没有结合整体图案的最大宽度,导致无法全局居中。
具体解决思路
- 确定全局基准宽度:对于输入n,整个图案的最大宽度为
2*n -1(最宽行的星号数量),所有行的前置空格都要以此为基准计算,保证全局居中。 - 新增偏移量参数:给递归函数添加
offset参数,用来控制当前层级钻石的整体前置空格数。初始调用时offset为0,递归到n-1时offset加1(因为子钻石要比父钻石右移1位)。 - 拆分打印逻辑:将「打印单个钻石」和「递归嵌套钻石」的逻辑分离,避免混合导致的空格计算混乱。
修正后的代码
#include <iostream> using namespace std; // 打印单个size大小的钻石,整体前置offset个空格 void print_single_diamond(int size, int offset) { int max_width = 2 * size - 1; // 打印上半部分(包括中间行) for (int i = 1; i <= size; ++i) { // 打印整体偏移空格 for (int j = 0; j < offset; ++j) { cout << ' '; } // 打印当前行的居中空格 int spaces = (max_width - (2 * i - 1)) / 2; for (int j = 0; j < spaces; ++j) { cout << ' '; } // 打印星号 for (int j = 0; j < 2 * i - 1; ++j) { cout << '*'; } cout << endl; } // 打印下半部分 for (int i = size - 1; i >= 1; --i) { for (int j = 0; j < offset; ++j) { cout << ' '; } int spaces = (max_width - (2 * i - 1)) / 2; for (int j = 0; j < spaces; ++j) { cout << ' '; } for (int j = 0; j < 2 * i - 1; ++j) { cout << '*'; } cout << endl; } } // 递归生成嵌套钻石序列 void diamonds(int n, int offset) { if (n == 1) { print_single_diamond(1, offset); return; } // 先打印n-1的钻石,偏移量+1 diamonds(n - 1, offset + 1); // 打印当前n的钻石 print_single_diamond(n, offset); // 再打印n-1的钻石,偏移量+1 diamonds(n - 1, offset + 1); } int main() { int n; cin >> n; diamonds(n, 0); return 0; }
代码说明
print_single_diamond函数负责打印单个独立钻石:先打印整体偏移的offset个空格,再计算当前行需要的居中空格(基于全局最大宽度),最后打印星号。diamonds函数专注递归逻辑:递归调用n-1时传递offset+1,确保子钻石整体右移一位,符合题目要求的嵌套结构。- 所有行的空格计算都基于全局最大宽度,保证整个图案完美居中。
内容的提问来源于stack exchange,提问作者Maison Mihara Sneakers
相关产品推荐
相关产品推荐

