Votre utilisation de la variable est incorrecte. En outre, le placement de votre point de terminaison récursif est discutable (et dans ce cas, inefficace en raison de l'ancien, l'utilisation variable variable). Enfin, vous augmentez le niveau local starShape
directement à l'aide du pré-incrément. Il n'y a pas besoin de le faire, et les raisons en fait de ne pas le faire.
La forme spécifique que vous décrivez est un nombre ascendant (en montée) de caractères par ligne jusqu'à ce qu'un seuil soit atteint, puis en répétant cette même séquence en descendant (descente) en sens inverse. L'algorithme de le faire est:
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
}
Avis cette volonté, par votre exemple donné, contient une répétition dans le centre de la figure si la même tâche est effectuée à la fois avant et après, la récursion.Dans le cas d'un ascendant, descendant ensuite motif de ligne, il ressemblerait à ceci:
Si vous ne voulez pas la ligne centrale répète, vous vous déplacez simplement l'emplacement de la récursivité et changer la condition d'égaler plutôt que supérieure:
void func(int limit, int current)
{
// TODO: perform task
// termination case (note ==)
if (current == limit)
return;
// recurse
func(limit, current+1);
// TODO: perform task
}
cela se traduira par un modèle qui ressemble à ceci:
*
**
***
****
***
**
*
Notez la ligne médiane est pas répété comme tous les autres.
Enfin, la tâche elle-même, qui peut être simplement:
void starline(const int length)
{
for (int i=0; i<length; ++i)
std::cout.put('*');
std::cout.put('\n');
}
Vous pouvez prendre cette fonction d'utilité et l'utiliser dans soit algorithme présenté ci-dessus, et cela fonctionnera.
Enfin, les paramètres à tous de ce qui précède sont const
parce que (a) il n'y a aucune raison de les modifier pour ces algorithmes, et (b) si vous le faites par inadvertance, vous voulez l'attraper à compile- temps; pas d'exécution.
Exemples
Les deux algorithmes utilisent la même fonction starline()
indiqué précédemment. La seule différence est la fonction récursive, et les résultats qu'ils émettent.
Le premier algorithme et sa sortie sont en dessous
#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);
}
sortie
*
**
***
****
*****
******
*******
********
*********
**********
**********
*********
********
*******
******
*****
****
***
**
*
La seconde est représentée suivant:
#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);
}
sortie
*
**
***
****
*****
******
*******
********
*********
**********
*********
********
*******
******
*****
****
***
**
*
'if (starShape == amountStars)' cela semble incorrect pour une raison quelconque. – Rakete1111
starShape est un personnage. pour (i = 0; i
user5478656
Je suppose que vous avez reçu le prototype d'une étoile vide (int amountStars, char starShape), par un professeur ou similaire. 'amountStars' est la quantité d'étoiles que vous devriez imprimer. 'starShape' est le caractère que vous devriez imprimer. Vous ne traitez pas les paramètres de cette façon. – molbdnilo