编写一个名为
的递归函数,输出DrawTriangle()
的线以形成右侧向上的等腰三角形。函数'*'
有一个参数,一个表示三角形底长的整数。假设基本长度始终为奇数且小于 20。在第一行的第一个DrawTriangle()
之前输出 9 个空格,以确保格式正确。'*'
提示:每绘制一条线,
的数量就会增加 2。'*'
例如:如果程序的输入是:3,则函数
输出:DrawTriangle()
* ***
例如:如果程序的输入是:19,则函数
输出:DrawTriangle()
* *** ***** ******* ********* *********** ************* *************** ***************** *******************
注意:当基长为19时,最后一行第一个
之前不输出空格。'*'
我能够使用以下递归函数正确地制作三角形:
void DrawTriangle(int baseLength, int spaces = 0) {
if(baseLength <= 0){
return;
}
DrawTriangle(baseLength - 2, spaces + 1);
for(int i = 0; i < spaces; i++){
cout << ' ';
}
for(int i = 0; i < baseLength; i++){
cout << '*';
}
cout << endl;
}
我遇到的问题是我不知道如何获得所需的正确间距,即奇异星号之前的 9 个空格
由于第一行应始终以 9 个空格开头,因此无论
baseLength
是什么,您都应该稍微改变一下逻辑。
要仅进行少量更改即可修复代码,您可以在函数顶部添加此语句:
if (spaces == 0) spaces = 9 - baseLength / 2;
这表示如果这是第一次调用 (
spaces == 0
),那么输出中的底行应该有 9 - baseLength / 2
空格。
这将给出所需的输出,但它看起来比应有的更复杂。例如,您可以在不使用递归的情况下执行此操作,而是使用从顶部开始每次迭代生成一行的循环。另外,您可以替换
i
循环并使用 std::cout 打印字符 N 次:
void DrawTriangle(int baseLength) {
for (int stars = 1; stars <= baseLength; stars+=2) {
std::cout << std::string(9 - stars/2, ' ') << std::string(stars, '*') << std::endl;
}
}