首页 > 解决方案 > 如何使用递归打印修改后的星号三角形图案?

问题描述

我正在使用 C++,我的任务是使用递归来打印具有特定模式的三角形:

例如,如果用户输入整数 4,控制台应输出以下内容: https ://i.stack.imgur.com/Gf46V.jpg

编辑:如果用户输入整数 3,控制台应输出以下内容: https ://i.stack.imgur.com/7Sqxb.jpg 这是我对模式的所有信息。

所以,我认识到每条线上的星星图案是:1、2、1、3、1、2、1、4(最大)、1、2、1、3、1、2、1

但我使用递归得到的最远距离是打印大小为 n 的三角形:

void starprint(int n) {
    for (int i = 1; i <= n; ++i)
    {
        if (i == 1) std::cout << "*" << std::endl;
        else
        {
            for (int j = 1; j <= i; j++)
            {
                std::cout << "*";
            }
            std::cout << std::endl;
        }
        if (i == n) 
            starprint(n - 1);
    }
}

所以现在我被困住了,因为模式有点奇怪,因为我对这些事情的直觉是使用迭代而不是递归,而且我对递归有点菜鸟。

关于如何解决这个问题的任何建议都会非常有帮助。多谢你们!

标签: c++recursion

解决方案


在这里,您可以为这个序列提供一个优雅的递归解决方案:

#include <iostream>
using namespace std;    

void printstar(int n){
    if(n == 1) {cout<<"1 "; return;}
    printstar(n - 1);
    cout<<n<<" ";
    printstar(n - 1);
}

int main() {
  printstar(4);
}

//output: 1 2 1 3 1 2 1 4 1 2 1 3 1 2 1

正如我在评论中所说,方法是认为这n将成为双方的一面镜子。每边将是另一个孤立的序列,其中间将是n - 1(将再次充当镜子),依此类推。

 1   2  1  3  1 2 1 [4] 1 2 1 3 1 2 1

 1   2  1 [3] 1 2 1

 1  [2] 1

[1]

推荐阅读