Неправильное использование переменной. Кроме того, размещение вашей рекурсивной точки окончания является сомнительным (и в этом случае неэффективным из-за прежнего неправильного использования переменной). Наконец, вы увеличиваете локальный starShape
напрямую, используя предварительный прирост. Нет необходимости делать это, и по сути дела не делать этого.
Конкретная фигура, которую вы описываете, представляет собой восходящее (в гору) количество символов на линию до достижения порога, а затем повторение той же последовательности, которая спускается (спуска) в обратном направлении. Алгоритм сделать это:
void func(const int limit, const int current)
{
// termination case (note >)
if (current > limit)
return;
// TODO: perform task
// recurse
func(limit, current+1);
// TODO: perform task
}
Заметим, что это будет, по вашему данном примере, содержат повторение в центре рисунка, если же задача выполняется и до, и после, рекурсии.В случае возрастания, а затем нисходящая модель линии, она будет выглядеть следующим образом:
Если вы не хотите повторяться центральная линия, вы просто изменить расположение рекурсии и изменить условие соответствия, а чем более:
void func(int limit, int current)
{
// TODO: perform task
// termination case (note ==)
if (current == limit)
return;
// recurse
func(limit, current+1);
// TODO: perform task
}
Это приведет к шаблону, который выглядит следующим образом:
*
**
***
****
***
**
*
Обратите внимание на центр линии не повторяется, как и все остальные.
Наконец, сама задача, которая может быть просто:
void starline(const int length)
{
for (int i=0; i<length; ++i)
std::cout.put('*');
std::cout.put('\n');
}
Вы можете взять эту функцию полезности и использовать его в либо алгоритма, представленного выше, и он будет работать.
Наконец, параметры все из выше const
, потому что (а) нет никаких оснований изменять их для этих алгоритмов, и (б), если вы случайно сделать так, вы хотите, чтобы поймать его на compile- время; не время выполнения.
Примеры
Оба алгоритма используют один и те же starline()
функцию, показанных ранее. Единственная разница - это рекурсивная функция и результаты, которые они испускают.
Первый алгоритм и его выход ниже
#include <iostream>
void starline(const int length)
{
for (int i=0; i<length; ++i)
std::cout.put('*');
std::cout.put('\n');
}
// function
void star(const int amountStars, const int length = 1)
{
// termination case
if (length > amountStars)
return;
starline(length);
star(amountStars, length+1);
starline(length);
}
int main()
{
star(10);
}
Выход
*
**
***
****
*****
******
*******
********
*********
**********
**********
*********
********
*******
******
*****
****
***
**
*
Второй показано в следующем:
#include <iostream>
void starline(const int length)
{
for (int i=0; i<length; ++i)
std::cout.put('*');
std::cout.put('\n');
}
// function
void star(const int amountStars, const int length = 1)
{
starline(length);
// termination case
if (length == amountStars)
return;
star(amountStars, length+1);
starline(length);
}
int main()
{
star(10);
}
Выход
*
**
***
****
*****
******
*******
********
*********
**********
*********
********
*******
******
*****
****
***
**
*
'if (starShape == amountStars)' по какой-то причине это выглядит неправильно. – Rakete1111
starShape - персонаж. для (i = 0; i
user5478656
Я понимаю, что вам дали прототип 'void star (int amountStars, char starShape),' учителем или схожим. 'amountStars' - количество звезд, которые вы должны печатать; «starShape» - персонаж, который вы должны печатать. Вы не рассматриваете параметры таким образом. – molbdnilo