Funktion mittels Rekursion erstellen
-
pittbull schrieb:
sieht so aus. ist aber kein guter anwendungsfall für rekursion. wer denkt sich solche blödsinnsaufgeben aus?
Wird wohl auf Mergesort hisnauslaufen, wo dann Rekursion durchaus angemessen ist. Diese Merge-Funktion müßte halt dann ausgetauscht werden durch eine iterative.
-
Wer sagt es denn, volkard ist zurück!

-
Bevor du dich an die Rekursion wagst, solltest du doch erstmal die einfachen Sachen richtig machen.
1. Input
Du hast den Prototypen der Funktion bekommen. Die hat keinen (void) Rückgabewert.
Also fragt die Funktion auch nicht ab, wieviel Werte eingelesen werden sollen. Das bekommt si mitgeteilt.2. Output.
Die Ausgabe soll formatiert erfolgen und nicht sortiert.
Durch Leerzeichen getrennt ist eher nicht formatiert.3. Copy
Die einzige Stelle wo du ziel_laenge verwendest, ist bei der Ausgabe (und die hat in dieser Funktion gar nichts zu suchen).
Was soll das temparr mit nur 3 Elementen? (beantworte dir selbst die Frage, nicht mir)
Du must vorher checken, ob durch die Angaben der Start- und Zielindices und der Länge irgendwo die Grenzen der Arrays überschritten werden und dann die Angaben entsprechend ändern.
Dann bleibt eine Schleife ohne Hilfsvariablen über.4. Mischen mittels Rekursion
Rekursion bedeutet wiederholter Aufruf der Funktion aus sich selber.
Keine Schleifen.
-
Als Inspiration zum Mergesort: http://www.youtube.com/watch?v=XaqR3G_NVoo
-
DirkB schrieb:
Als Inspiration zum Mergesort: http://www.youtube.com/watch?v=XaqR3G_NVoo
Hab da Mergesort eher nicht erkannt.
Der da sagt mir zu.
http://www.youtube.com/watch?v=EeQ8pwjQxTM
-
Zur zweiten Aufgabe:
Was ist denn für dich formatiert?
-
Mr. Bit schrieb:
Was ist denn für dich formatiert?
Sauber strukturiert und geordnet.
Rekursion bedeutet wiederholter Aufruf der Funktion aus sich selber.
Das muss nicht wiederholt sein.
-
Sone schrieb:
Sauber strukturiert und geordnet.
Also nur als Ausgabe 1 2 3 4 5 oder was??? Tolle Aufgabe...
-
Mr. Bit schrieb:
Also nur als Ausgabe 1 2 3 4 5 oder was???
So ungefähr, ja.
Das erreichst du schon mitstd::copy( arr, arr + n, std::ostream_iterator<int>(std::cout, " "));Und das Einlesen durch
std::copy_n( std::istream_iterator<int>(std::cin), n, arr );Aber die Aufgabe will ja, dass du die Schleife explizit schreibst.
Tolle Aufgabe...
Das ist nicht der Grund, warum die Aufgaben Blödsinn sind.
-
Mr. Bit schrieb:
Also nur als Ausgabe 1 2 3 4 5 oder was??? Tolle Aufgabe...
Formatiet kann auch
0 | 30 1 | 110 .. 24 | 3oder
Das 1. Elemnet ist: 30 Das 2. Elemnet ist: 110 .. Das 25. Elemnet ist: 3bedeuten.
(Achte auf die Ausrichtung der Zahlen)
-
Naja da würde ich sagen lasse ich es beim Leerzeichen...
So bis jetzt regelkonform?
void output(int n, int arr[]) { cout << " Die Zahlen formatiert: \n" << endl; for(int x = 0; x < n; x++) { cout <<"" << arr[x] << " "; } cout << "\n" << endl; } void copy(int quelle[],int quelle_laenge, int anfang, int anzahl, int ziel1[], int ziel_anfang, int ziel_laenge) { for (int i = anfang-1, j = ziel_anfang-1; i < anzahl, j < (ziel_anfang-1+anzahl); i++, j++) { ziel1[j] = quelle[i]; } }
-
Mr. Bit schrieb:
So bis jetzt regelkonform?
Ich nehme an, Du menutzt den Microsoft-Compiler?
Dann Drücke Alt+A (alles markieren) und dann Alt+F8 (alles automatisch einrücken) vor dem Posten.
-
Nein.
Du weißt nicht, was
i < anzahl, j < (ziel_anfang-1+anzahl)macht.Außerdem läßt du vollkommen
quelle_laengeundziel_laengeaußer acht.
Und bist du dir bei den -1 sicher?Da in C der Index bei Arrays bei 0 anfängt, würde ich auch eine 0 für
anfangangeben, wenn die Quelleu und /oder das Ziel ganz am Anfang ist.
Aber das ist Definitionssache, die du aber dokumentiern musst.
-
Wie soll ich denn hier die längen verwenden? Die werden doch in der main bestimmt. Wozu brauche ich die in der Funktion?
Würdest du das kopieren in einer oder mehreren Schleifen machen?
Bei meinem geposteten Code hat die Ausgabe gestimmt.
-
Mr. Bit schrieb:
Wie soll ich denn hier die längen verwenden? Die werden doch in der main bestimmt. Wozu brauche ich die in der Funktion?
Würdest du das kopieren in einer oder mehreren Schleifen machen?
Bei meinem geposteten Code hat die Ausgabe gestimmt.
Ja, für dein spezielles Beispiel.
Dann setze anzahl mal auf 6 und ziel_anfang auf 10.
Und dann noch anfang auf 4.
(Bei den Angaben beziehe ich mich auf dein Eröffnungspost)
-
Wie soll ich denn hier die längen verwenden? Die werden doch in der main bestimmt. Wozu brauche ich die in der Funktion?
Würdest du das kopieren in einer oder mehreren Schleifen machen?
-
Damit du nicht über die Grenzen des Arrays schreibst/liest.*
War mein Beispiel nicht deutlich?
Wieviel Schleifen willst du denn nehmen? Und warum?
*Die Funktion kann aus den Array allein nicht mehr die Größe bestimmen.
Und du greifst auf die Arrays in der Funktion zu. Da nützt es nichts wenn die Größen in der main bekannt sind.
-
Also ich weiß nicht wie ich das ohne anzahl -1 machen soll...
Das cout ist nur zur kontrolle Deklariert...
void copy(int quelle[],int quelle_laenge, int anfang, int anzahl, int ziel1[], int ziel_anfang, int ziel_laenge) { if( anfang+anzahl > quelle_laenge) { cout << " Die zu kopierenden Elemente ueberschreiten die Array Groesse.\n" << endl; } else { if(anzahl+ziel_anfang > ziel_laenge) { cout << " Die zu einfuegenden Elemente ueberschreiten die Array Groesse.\n" << endl; } else { for (int i = anfang-1, j = ziel_anfang-1; i < anfang-1+anzahl, j < ziel_anfang-1+anzahl; i++, j++) { ziel1[j] = quelle[i]; } for(int x = 0; x < ziel_laenge; x++) { cout <<"" << ziel1[x] << " "; } cout << "\n" << endl; } } }Könnte noch schreiben, dass wenn "anfang" als 0 initialisiert wird, Datenverlust droht...?
-
Mr. Bit schrieb:
Also ich weiß nicht wie ich das ohne anzahl -1 machen soll...
Welchen Wert gibst du für
anfangan, wenn du vom Anfang des Arrays kopieren willst.
Du würdest wohl 1 nehmen, weil es das erste Element ist. Das ist aber nicht C-Style.DirkB schrieb:
Da in C der Index bei Arrays bei 0 anfängt, würde ich auch eine 0 für
anfangangeben, wenn die Quelleu und /oder das Ziel ganz am Anfang ist.DirkB schrieb:
Aber das ist Definitionssache, die du aber dokumentiern musst.
Das ist deine Funktion. Wenn du sagst 1 ist der Anfang, ist das auch in Ordnung.
Mr. Bit schrieb:
Das cout ist nur zur kontrolle Deklariert...
Warum nimmst du dafür nicht deine Funktion output? (Dafür ist sie da)
-
Ich hatte den Anfang als 3 festgesetzt. Wollte aber gucken was passiert wenn man 0 eingibt. Klar werden dann nicht wenn anzahl = 3 auch 3 Elemente eingelesen. Wenn ich Anfang nicht -1 machen ist der Anfang imm um eins versetzt...
Die Funktion output ist doch nur für die erste Aufgabe, denke ich!?
Wie würdest du die Funktion mischen angehen? Mit Mergesort?