De manière récursive l'impression d'un motif en étoile
Pour mon c++ structures de données de la classe notre mission consiste à imprimer un motif d'étoiles comme ceci
*
* *
* * *
* * * *
* * * *
* * *
* *
*
avec le nombre de lignes dans le modèle déterminé par la saisie de l'utilisateur. De sorte que le motif ci-dessus affiche si l'utilisateur entre dans une 4.
Nous avons eu une précédente affectation, où nous avons eu pour imprimer le schéma inverse, l'un comme ce
* * * * *
* * * *
* * *
* *
*
*
* *
* * *
* * * *
* * * * *
et au-dessus de la tendance de l'impression si l'utilisateur entre un 5. Ce motif, l'un au-dessus, je n'ai eu aucun problème avec. J'ai utilisé une boucle for pour imprimer le haut de la moitié, alors appelée récursivement la fonction de nouveau, et puis même pour la boucle d'imprimer le fond de la moitié dans la direction opposée. Pour référence, voici le code que j'ai utilisé pour le dessus motif:
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
Cette fonction fonctionne comme la façon dont je le veux, alors j'ai pensé que je pourrais l'utiliser comme une référence pour terminer la deuxième tâche. Le problème, je vais avoir, c'est que, s'il est assez facile à terminer à la première affectation (impression d'une ligne de 4 étoiles, puis une ligne de 3, puis une ligne de 2 , puis une ligne de 1, alors tout ce qui est nouveau dans l'ordre inverse), je n'arrive pas à comprendre comment format la pour les boucles d'imprimer le motif de départ avec une ligne de 1 étoile, puis une ligne de 2, puis une ligne de 3, et ainsi de suite, jusqu'à ce qu'elle est appelée récursivement et imprimé à nouveau dans l'ordre inverse.
Pour la référence, c'est le code que j'ai (pour l'instant) pour la deuxième affectation:
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);
}
}
La seule chose que cette affiche est la deuxième moitié de la figure;
(Si l'utilisateur entre un 5)
* * * * *
* * * *
* * *
* *
*
Et même de faire ce travail, j'ai récursive de la fonction à la fin, ce qui est hors de l'ordre.
Je suppose que je suis juste confus sur la façon dont cette récursivité est supposé fonctionner, mais j'ai joué avec pendant des heures et je n'arrive pas à le reformater ou de la modifier ou de le restructurer pour qu'elle s'imprime comme j'en ai besoin. Quelqu'un peut-il me donner quelques conseils? Juste peut-être écrire un peu de code de pseudo pour m'aider. C'est pour l'école, donc j'ai besoin d'être en mesure de le comprendre, mais je suis vraiment perdu maintenant.
oui la cession des appels pour la récursivité. C'est le seul moyen de tourner correctement
Il suffit de pointer qu'une fonction pour imprimer un motif ne doit pas supposer quoi que ce soit sur l'endroit où la valeur du paramètre est venu. Vous devriez être en mesure d'utiliser cette fonction de manière transparente avec le paramètre à venir à partir d'un fichier, codée en dur, etc. Validation de la saisie appartient à l'entrée.
J'ai inclus une réponse avec une légère modification à votre code. Il fonctionne comme prévu. Il utilise la récursivité avec un argument supplémentaire juste comme vous l'avez fait. Je l'ai testé sur ideone.com et inclus le lien et le résultat dans ma réponse.
OriginalL'auteur Dariani Disani | 2015-04-09
Vous devez vous connecter pour publier un commentaire.
De l'essayer. Il est peu modifié la version de votre code. La limite supérieure est transmis à tous les récurrences et de la fonction récursive, les appels sont effectués avec les valeurs commençant par 1 (1 seul départ dans la première ligne):
Je l'ai testé et le résultat est correct. Le lien est:
http://ideone.com/ez6pZ5
ideone résultat:
OriginalL'auteur erol yeniaras
Je suggère l'utilisation de deux fonctions récursives, l'un pour imprimer dans l'ordre croissant et l'autre à imprimer dans l'ordre décroissant.
Après que vous obtenez les deux fonctions de travail, enregistrez une copie du programme.
Vous pouvez ensuite essayer de créer une fonction de l'effectue à la fois croissante et décroissante, les commandes d'étoiles.
OriginalL'auteur Thomas Matthews
Vous n'avez pas l'impression de l'stars après votre récursivité appel:
note le si la condition avait pour changer un peu trop. Je suis également d'accord avec Thomas, il pourrait faire plus de sens à la structure de votre récursivité différemment:
OriginalL'auteur dwcanillas
Si vous voulez le faire de manière récursive, vous devez garder à l'esprit qu'il y a plusieurs états: l'état où vous êtes en comptant jusqu'à
N
, et de l'état où vous comptez revenir à1
. Donc, si vous devez aller récursivement, vous avez besoin de garder une trace de ces choses supplémentaires:Et cette fonction a juste à savoir qui à côté
printStarsImpl()
la fonction à appeler - si, il suffit d'appeler aveccount + sign
, si nous retournionssign
à-1
, ou si nous ne faisons rien... le tout après l'impressioncount
*
's de cours.L'appel initial est alors:
OriginalL'auteur Barry
L'approche simple si l'utilisation de la fonction déclarée comme ayant un seul paramètre est le suivant, à l'aide d'une variable locale statique dans la fonction
Le programme de sortie peut ressembler à
Si vous ne souhaitez pas utiliser une variable statique à l'intérieur de la fonction récursive, puis au lieu de cela, vous pouvez appliquer un truc avec le flux standard de la fonction membre
width
. Dans ce cas, la fonction récursive examinera la manière suivanteLa sortie sera la même que ci-dessus.
P. S. Il semble que le seul programmeur qui est capable d'écrire la fonction est moi chômeurs.:) Tous les autres sont incapables de faire cette mission pour les débutants.:)
OriginalL'auteur Vlad from Moscow
Pour la cause de l'exercice d'une fonction récursive pour imprimer les étoiles et un autre pour déterminer le nombre d'étoiles:
Exemple de sortie:
OriginalL'auteur RooiWillie