Die Verwendung Ihrer Variablen ist nicht korrekt. Auch die Platzierung Ihres rekursiven Endpunkts ist fraglich (und in diesem Fall wegen der früheren, inkorrekten Variablennutzung ineffektiv). Schließlich erhöhen Sie die lokale starShape
direkt mit Pre-Inkrement. Es besteht keine Notwendigkeit, dies zu tun, und in der Tat Gründe nicht zu.
Die spezifische Form, die Sie beschreiben, ist eine aufsteigende (bergauf) Anzahl von Zeichen pro Zeile, bis ein Schwellenwert erreicht ist. Dann wird die gleiche Sequenz in umgekehrter Reihenfolge (abwärts) wiederholt. Der Algorithmus, das zu tun ist:
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
}
Hinweis dies wird nach Ihrem gegebenen Beispiel enthält eine Wiederholung in der Mitte der Figur, wenn die gleiche Aufgabe erledigt ist, sowohl vor und nach, der Rekursion.Im Falle eines ansteigenden, dann Linienmuster absteigend, würde es so aussehen:
Wenn Sie die Mittellinie wiederholt nicht möchten, können Sie einfach die Position der Rekursion bewegen und die Bedingungen ändern, eher passend als weniger:
void func(int limit, int current)
{
// TODO: perform task
// termination case (note ==)
if (current == limit)
return;
// recurse
func(limit, current+1);
// TODO: perform task
}
Dieses in einem Muster führt, das wie folgt aussieht:
*
**
***
****
***
**
*
Beachten Sie die Mittellinie ist nicht wie alle anderen wiederholt.
schließlich die Aufgabe selbst, die einfach sein können:
void starline(const int length)
{
for (int i=0; i<length; ++i)
std::cout.put('*');
std::cout.put('\n');
}
Sie können diese Programmfunktion übernehmen und verwenden Sie es in entweder Algorithmus oben dargestellt, und es wird funktionieren.
Schließlich werden die Parameter alle der oben genannten sind const
, weil (a) gibt es keinen Grund, sie für diese Algorithmen zu ändern, und (b), wenn Sie versehentlich so tun, wollen Sie es bei der Kompilierung fangen Zeit; keine Laufzeit.
Beispiele
Beide Algorithmen verwenden die gleiche starline()
Funktion früher gezeigt. Der einzige Unterschied ist die rekursive Funktion und die Ergebnisse, die sie ausgeben.
Der erste Algorithmus und seine Ausgabe unterhalb
#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);
}
Output
*
**
***
****
*****
******
*******
********
*********
**********
**********
*********
********
*******
******
*****
****
***
**
*
Die zweite ist unten gezeigt:
#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);
}
Output
*
**
***
****
*****
******
*******
********
*********
**********
*********
********
*******
******
*****
****
***
**
*
'if (starShape == amountStars)' das sieht aus irgendeinem Grund falsch aus. – Rakete1111
starShape ist ein Zeichen. für (i = 0; i
user5478656
Ich nehme an, dass Sie den Prototyp "void star (int amountStars, char starShape)" von einem Lehrer oder ähnlichem erhalten haben. 'amountStars' ist die Menge an Sternen, die Sie drucken sollten; 'starShape' ist das Zeichen, das du drucken solltest. Sie behandeln die Parameter nicht so. – molbdnilo