Не получается вывести симметричную ёлку

Используя рекурсию, необходимо вывести симметричную ёлку из N равнобедоенных блоков.

#include <stdio.h>
#include <iostream>
using namespace std;

/* nstars  - сколько звездочек напечатать     */
/* nspaces - сколько пробелов напечатать перед звездочками */

//функция, рисующая строку блока елки
void drawOneLine(int nspaces, int nstars)
{
    int i; /* номер печатаемой звездочки, счетчик */
    /* он же - номер печатаемого пробела   */

    for (i = 0; i < nspaces; i++)
        putchar(' ');
    for (i = 0; i < nstars; i++)
        putchar('*');
    putchar('\n');
}

/*
            n (номер строки)
     ...*               1
     ..***              2
     .*****             3
     *******            4

    Всего строк:                                    LINES
    Число звездочек в n-ой строке:                  n*2 - 1
    Число пробелов спереди:   LINES - n
    */

   //функция, рисующая один блок елки
    void block_tree(int LINES, int n, int k)
    {
    int nline; /* номер строки */

    for (nline = 1; nline <= LINES; nline++)
        drawOneLine(LINES - nline +k, /* число пробелов  --> nspaces */
                nline * 2 - 1  /* число звездочек --> nstars */
    );
}


 // рекурсивная функция, рисующее елку
auto tree(int i, int n, int k)
{
    k = 0;
    if (i == n)
        return '0';
    else {
        block_tree(i + 1, n, n-k);
        k++;}
    tree(i + 1, n, k);
}
int main()
{
    int n;
    cout << " n =";
    cin >> n;
    tree(1, n + 1, 0);

    system("pause");
    return 0;
}

Ответы (1 шт):

Автор решения: Mikhailo

Смещайте все треугольники на одинаковую величину:

//функция, рисующая один блок елки
void block_tree(int LINES, int offset)
{
    for (int nline = 1; nline <= LINES; nline++)
        drawOneLine(offset - nline, /* число пробелов  --> nspaces */
                    nline * 2 - 1  /* число звездочек --> nstars */
                   );
}


// рекурсивная функция, рисующее елку
void tree(int i, int n, int offset)
{
    if (i == n)
        return;
    else {
        block_tree(i + 1, offset);
    }
    tree(i + 1, n, offset);
}
int main()
{
    int n;
    cout << " n =";
    cin >> n;
    tree(1, n + 1, n+2);

    system("pause");
    return 0;
}
→ Ссылка