JavaScript打印边缘为奇数的数字金字塔问题求解
边缘奇数数字金字塔打印修复
预期效果
示例中点号仅用于占位展示缩进,实际为空格,n=5时输出结构如下:
.......5 ...3,4,3 1,2,3,2,1
原有实现代码
function p(n){ let string = ""; for (let i = 1; i <= n; i++) { for (let j = 1; j <= n - i; j++) { string += " " ; } for (let k = 1; k <= 2*i-1; k++) { string += n-k +1; } string += "\n"; } console.log(string); } p(5);
原有代码问题
- 行数遍历逻辑错误:原代码遍历1到n所有行,实际只需要输出边缘值为奇数的行,从n倒序每次减2直到1即可
- 缩进计算错误:原代码按单字符宽度计算缩进,未考虑数字间的逗号占位,无法实现居中效果
- 内容生成逻辑错误:原代码直接拼接数字未添加逗号分隔,数字增减序列不符合要求,没有实现先增后减的对称结构
修复后代码
function p(n){ let string = ""; // 从最大奇数边缘值开始,每次减2遍历到1,仅输出需要的行 for (let edge = n; edge >= 1; edge -= 2) { const maxVal = (n + edge) / 2; const numArr = []; // 拼接递增段:从当前边缘值涨到行最大值 for (let i = edge; i <= maxVal; i++) { numArr.push(i); } // 拼接递减段:从最大值-1降回当前边缘值 for (let i = maxVal - 1; i >= edge; i--) { numArr.push(i); } const lineContent = numArr.join(','); // 按最长行宽度计算前置缩进,保证居中 const maxLineLen = 2 * n - 1; const indent = ' '.repeat((maxLineLen - lineContent.length) / 2); string += indent + lineContent + '\n'; } console.log(string); } p(5);
调用p(5)即可输出符合要求的居中数字金字塔,数字间用逗号分隔,每行边缘值均为奇数。
内容的提问来源于stack exchange,提问作者TiCode
相关产品推荐
相关产品推荐

