c++ - 递归打印星形图案

标签 c++ recursion printing

对于我的 C++ 数据结构类,我们的任务是打印这样的星星图案

*
* *
* * *
* * * *
* * * *
* * *
* *
*

模式中的行数由用户输入确定。因此,如果用户输入 4,就会打印上面的模式。

我们之前有一个任务,我们必须打印相反的图案,像这样

* * * * *
* * * *
* * *
* *
*
*
* *
* * *
* * * *
* * * * *

如果用户输入 5,就会打印上面的模式。这个模式,上面那个,我没有问题。我使用 for 循环打印上半部分,然后再次递归调用该函数,然后同样的 for 循环以相反的方向打印下半部分。作为引用,这是我用于上述模式的代码:

int main()
{
    int number;                                             
    cout << "Enter the number of lines in the grid: ";      

    cin >> number;                                          
    printStars(number);                                     
    cout << endl << "Grid Pattern Complete - End of Program.";
    return 0;
} // end of main 

void printStars(int num)                        
{
    if (num < 0) cout << endl << "Please enter a non negative number." << endl;

        else{

            if (num == 0) return;               

            else{
            for (int q = 1; q <= num; q++)      
            {cout << "*";}
            cout << endl;

            printStars(num - 1);        

            for (int q = 1; q <= num; q++)      
            {cout << "*";} 

            cout << endl;
        } 
    } 
} // end printStars

这个函数就像我想要的那样工作,所以我想我会用它作为引用来完成第二个作业。我遇到的问题是,虽然完成第一个任务很容易(打印一行 4 星,然后一行 3,然后一行 2 ,然后一行 1,然后再次打印所有这些逆序),我似乎无法弄清楚如何格式化 for 循环以打印从 1 星行开始的模式,然后是 2 行,然后是 3 行,依此类推,直到它被递归调用并以相反的顺序再次打印。

作为引用,这是我(到目前为止)第二次作业的代码:

int main()
{
    int number;                                             
    cout << "Enter the number of lines in the grid: ";      
    cin >> number;
    printStars(number, 0);                                 

    cout << endl << "Grid Pattern Complete - End of Program.";

    return 0;
}

void printStars(int num, int num2)
{
  if (num2 <= num)
  {

      for (int e = num; e > num2; e--)
      {
          cout << "*";
      }

      cout << endl;

      printStars(num - 1, num2);

  }
}

唯一打印的是模式的后半部分;

(如果用户输入 5)

* * * * *
* * * *
* * *
* *
*

甚至为了让它工作,我必须在最后递归调用函数,这是乱序的。

我想我只是对这个递归应该如何工作感到困惑,但我已经玩了几个小时而且我似乎无法重新格式化它或重新排列它或重组它以便它像我需要的那样打印。有人可以给我一些指导吗?也许只是写一些伪代码来帮助我。这是为学校准备的,所以我需要能够理解它,但我现在真的迷路了。

最佳答案

试试这个。它是您的代码的最小修改版本。将上限传递给所有递归,并使用以 1 开头的值执行递归函数调用(第一行仅 1 开始):

void printStars(int num, int limit)                         
{
        if (num >limit) return;              
        else{
        for (int q = 1; q <= num; q++)      
        {cout << "*";}
        cout << endl;

        printStars(num +1, limit);        

        for (int q = 1; q <= num; q++)      
        {cout << "*";} 

        cout << endl;
    } 

}

int main()
{        
    int number=5;  
    cin>>number;                                
    printStars(1, number);                                     

    return 0;
} // end of main 

我测试了一下,结果是正确的。链接是:

http://ideone.com/ez6pZ5

ideone 结果:

Success time: 0 memory: 3144 signal:0

*
**
***
****
*****
*****
****
***
**
*

关于c++ - 递归打印星形图案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29544270/

相关文章:

c++ - 将代码拆分为多个 .cpp 会减少编译时间吗?

c++ - 在没有锁的情况下设置条件变量监视器标志是否有效?

c++ - 在Qt中测试Lambda唯一连接

c++ - 递归模板定义

pdf - 调整 PDF 格式以更快地打印它

javascript - 在 JavaScript 中打印 Word 文档而不是下载它

Java 不打印整数变量

c++ - 重定向文件访问

java - 如何通过Java中给出的例子来掌握二分查找递归的概念?

javascript 递归调用对象方法