C++递归绘制正立等腰三角形:如何实现首行9空格的要求格式?
解决递归绘制等腰三角形的首行空格问题
你的代码核心递归逻辑是对的,但当前通过固定初始spaces=0累加的方式,无法满足首行9个空格的要求——因为初始空格数需要根据输入的底边长动态计算。这里提供两种简洁的调整方案:
方案一:直接计算每行空格数(推荐)
去掉spaces参数,直接根据当前行的baseLength计算需要的空格数。首行(baseLength=1)的空格数是9,每往下一行(baseLength增加2),空格数减少1,因此空格数公式为:9 - (baseLength - 1)/2。
修改后的代码:
#include <iostream> using namespace std; void DrawTriangle(int baseLength) { if (baseLength <= 0) { return; } // 先递归绘制上一行(*更少的行) DrawTriangle(baseLength - 2); // 计算当前行需要的空格数 int spaces = 9 - (baseLength - 1) / 2; for(int i = 0; i < spaces; i++){ cout << ' '; } for(int i = 0; i < baseLength; i++){ cout << '*'; } cout << endl; } // 调用示例 int main() { DrawTriangle(3); cout << endl; DrawTriangle(19); return 0; }
方案二:使用辅助函数传递初始空格数
如果想保留原有的spaces参数传递逻辑,可以封装一个对外接口函数,计算正确的初始空格数后再调用递归函数:
#include <iostream> using namespace std; // 内部递归函数 void DrawTriangleHelper(int baseLength, int spaces) { if(baseLength <= 0){ return; } DrawTriangleHelper(baseLength - 2, spaces + 1); for(int i = 0; i < spaces; i++){ cout << ' '; } for(int i = 0; i < baseLength; i++){ cout << '*'; } cout << endl; } // 对外接口,计算初始空格数 void DrawTriangle(int baseLength) { // 初始空格数 = 9 - (底边长-1)/2 int initialSpaces = 9 - (baseLength - 1) / 2; DrawTriangleHelper(baseLength, initialSpaces); } // 调用示例 int main() { DrawTriangle(3); cout << endl; DrawTriangle(19); return 0; }
两种方案都能实现需求:首行第一个*前有9个空格,每行*数递增2个,底边长为奇数且小于20时输出正确的正立等腰三角形。
内容的提问来源于stack exchange,提问作者user23998448
相关产品推荐
相关产品推荐

