C++ - 如何使用递归绘制等腰直立三角形?

问题描述 投票:0回答:1

编写一个名为

DrawTriangle()
的递归函数,输出
'*'
的线以形成右侧向上的等腰三角形。函数
DrawTriangle()
有一个参数,一个表示三角形底长的整数。假设基本长度始终为奇数且小于 20。在第一行的第一个
'*'
之前输出 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 个空格

c++ recursion ascii-art
1个回答
0
投票

由于第一行应始终以 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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.