Rekursion: Rechenmauer mit Array erstellen

Krön

Mitglied
Hallo,

mit dem Array {1,2,3,4,5} soll ich die Ausgabe mit Rekursionen so aussehen:
(Eine Rechenmauer mit dem Array {1,2,3,4,5} erstellen)

48
20 28
8 12 16
3 5 7 9
1 2 3 4 5



Meine Lösung sieht allerdings so aus:
1 2 3 4 5
3 5 7 9
8 12 16
20 28
48

Ich muss das jetzt alles "umdrehen". Ich glaube, der Trick liegt bei der Rekursion den Stack zu benutzen. Allerdings habe ich keine Idee wie das gehen soll. Es endet in einer Dauerschleife oder es werden falsche Ergebnisse angezeigt:

Mein aktueller Stand:
Java:
package Übungen;

public class Symmetrie {

    public static void main(String[] args) {


        int[] b = {1, 2, 3, 4, 5,0}; //0 dient als Platzhalter, damit Array in der Schleife ( Zeile 21) keinen Error gibt.
        int j = 5;
        reku(b,j);
    }

    public static void reku(int [] num,int j) {

        System.out.println("");
        if (j > 0)
        {
            for ( int i = 0; i < j; i++) {

                System.out.print(num[i] + " ");
                num[i] = num[i] + num[i+1];
            }

            reku(num,j-1);
        }
    }
}

Über Vorschläge würde ich mich sehr freuen.

LG K.
 
Beste Antwort
Über Vorschläge würde ich mich sehr freuen.
[CODE lang="java" title="TestWallRecursive"]public class TestWallRecursive {
public static void main(String[] args) {
int[] values = { 1, 2, 3, 4, 5 };
printMathWall(values, values.length);
}

public static void printMathWall(int[] values, int end) {
if( end == 0)
return ;
String out = values[0] + "";
for (int i = 1; i < end; i++) {
out += " " + values;
values[i-1] = values[i-1]+values;
}
System.out.println(out);
printMathWall(values, end-1);
}
}[/CODE]
Du könntest je die Werte für die nächste Ebene in ein neues Array sschreiben.

Mit diesem rufts Du dann Deine rekursive Methode auf.

Die Ausgabe des Arrays der jeweiligen Ebene machst Du nach der Rückkehr aus der rekursiven Methode.

Dann dreht sich die Ausgabe um.
 
Über Vorschläge würde ich mich sehr freuen.
[CODE lang="java" title="TestWallRecursive"]public class TestWallRecursive {
public static void main(String[] args) {
int[] values = { 1, 2, 3, 4, 5 };
printMathWall(values, values.length);
}

public static void printMathWall(int[] values, int end) {
if( end == 0)
return ;
String out = values[0] + "";
for (int i = 1; i < end; i++) {
out += " " + values;
values[i-1] = values[i-1]+values;
}
System.out.println(out);
printMathWall(values, end-1);
}
}[/CODE]
 
Beste Antwort
Du könntest je die Werte für die nächste Ebene in ein neues Array sschreiben.

Danke. Das habe ich auch versucht. Leider wurde das bei mir zu komplex und hat am Ende zu falschen Berechnungen geführt.


Vielen Dank Blender3D. Jetzt verstehe ich was ich falsch gemacht habe. 😅
Ich war, glaube ich, teilweise auf dem richtigen Weg.

Ich habe allerdings die Zeile 15 und 16 vertauscht, damit oben die 48 steht und darunter die anderen Zahlen.
printMathWall(values, end-1);
System.out.println(out);

Noch eine kleine Frage habe ich noch: Wenn das Ergebnis jetzt rechtsbündig sein soll, wie genau muss der Code dann ausschauen?

Unbenannt.PNG


Mein Gedanke war von rechts nach links das Ergebnis in dem String zu speichern. Aber irgendwie bin ich da durcheinander gekommen. und es endete in einem Error.
 
Zuletzt bearbeitet:
Wenn man die Signatur der Methode verändern darf, dann könnte man noch die maximale Breite als Parameter dazu nehmen.

Dann wird beim ersten Aufruf geschaut, welche Breite benötigt wird und alle rekursiven Aufrufe können sich daran orientieren.

Dann hast du links keinen Rand und es ist immer rechtsbündig.

Bei dem Algorithmus ist die längste Zeile im obersten Aufruf. Wenn das nicht so wäre, dann müsste man das Maximum noch zurück geben. Aber das ist hier unnötig so ich mich nicht vertan habe.
 
Zum Beispiel (die 20 ist die Breite):
Java:
System.out.printf("%20s%n", out);
Wo genau muss ich den Code einfügen? Ich habe diesen Code System.out.println(out); durch System.out.printf("%20s%n", out); ersetzt. Allerdings ist nichts passiert.

Wenn man die Signatur der Methode verändern darf, dann könnte man noch die maximale Breite als Parameter dazu nehmen.

Dann wird beim ersten Aufruf geschaut, welche Breite benötigt wird und alle rekursiven Aufrufe können sich daran orientieren.

Dann hast du links keinen Rand und es ist immer rechtsbündig.

Bei dem Algorithmus ist die längste Zeile im obersten Aufruf. Wenn das nicht so wäre, dann müsste man das Maximum noch zurück geben. Aber das ist hier unnötig so ich mich nicht vertan habe.
Wie genau muss dann vorgegangen werden, nachdem ich einen zusätzlichen Parameter mit max. Breite angegeben habe?
 
Also mit dem format String wie von @mihe7 gegeben sollte alles auf 20 Zeichen rechtsbündig ausgegeben werden.

Den Format-String könntest Du mit dem max Wert zusammen bauen.

Wenn Du so einen format-String nicht nutzen willst, kannst Du das auch selbst machen:
Wenn Du weisst, dass das maximum an Zeichen max ist und Du einen String ausgeben willst, der n Zeichen hat, dann kannst Du erst max-n Leerzeichen schreiben um dann den eigentlichen String zu schreiben. (Aber mit dem format String ist es deutlich schöner und besser)
 
Also mit dem format String wie von @mihe7 gegeben sollte alles auf 20 Zeichen rechtsbündig ausgegeben werden.

Den Format-String könntest Du mit dem max Wert zusammen bauen.

Wenn Du so einen format-String nicht nutzen willst, kannst Du das auch selbst machen:
Wenn Du weisst, dass das maximum an Zeichen max ist und Du einen String ausgeben willst, der n Zeichen hat, dann kannst Du erst max-n Leerzeichen schreiben um dann den eigentlichen String zu schreiben. (Aber mit dem format String ist es deutlich schöner und besser)
Beim Ausgeben habe ich eine falsche Klasse ausgewählt. Deshalb hat das nicht geklappt. 🙈

Der Code von @mihe7 hat doch funktioniert.

Ich bleibe dann, wie du erwähnst hast, lieber bei der schöneren Variante. Die Idee mit max-n Leerzeichen hört sich allerdings auch gut an.

Dann danke an alle die mir geholfen haben. Ich konnte hierbei vieles Lernen. 😀
 
Ich bleibe dann, wie du erwähnst hast, lieber bei der schöneren Variante.
Wenn ich es richtig verstanden habe, ist die "schönere Variante" rechtsbündige Ausgabe.

Noch schöner wäre nach meiner Meinung mittige Ausgabe.

Das wäre doch eine interessante Herausforderung.

Weiterhin könnten die Zahlen auch unterschiedliche Breiten haben. Das könnte man auch noch beachten.

Als Krönung Ausgabe nach HTML, PDF(über HTML-Hilfe) oder Ascii-Art.
 
[CODE lang="java" title="TestWallRecursive"]public class TestWallRecursive {
public static void main(String[] args) {
int[] values = { 1, 2, 3, 4, 5 };
printMathWall(values, values.length);
}

public static void printMathWall(int[] values, int end) {
if( end == 0)
return ;
String out = values[0] + "";
for (int i = 1; i < end; i++) {
out += " " + values;
values[i-1] = values[i-1]+values;
}
System.out.println(out);
printMathWall(values, end-1);
}
}[/CODE]

Ich muss doch mal eins fragen:
So wie ich es aktuell lese, wenn du erstmals die FUnktion mit dem Startarray aufrufst, dann machst du ja mancherlei Kram aber im Endeffekt wird doch zuerst einmal durch das println(out) das Startarray ausgegeben, oder?
Also "1 2 3 4 5" ausgegeben.
Und erst danach gehst du in die rekursion.

Damit würde doch der Ausdruck doch genau in der falschen Reihenfolge ausgegeben werden wie es auch bei Krön war, oder?

ich hätte fast behauptet, du müsstest du println() und die rekursionzeile tauschen! Wenn ich mich jetzt nicht verguckt habe.


Edit: Nevermind, wurde ja oben schon einmal beiläufig erwähnt 🙂
 
Damit würde doch der Ausdruck doch genau in der falschen Reihenfolge ausgegeben werden wie es auch bei Krön war, oder?

Das war nur ein Hinweis wie die Lösung zu formulieren ist. Der String out ermöglicht es in meinem Code durch Vertauschung von 2 Zeilen ganz einfach die gewünschte Reihenfolge zu ermöglichen. @Krön hat das bereits erkannt und hat meinen Code als für ihn die beste Antwort gekennzeichnet. ( Ein wenig selber denken lassen ist der Hintergrund dafür 😉 )
 
Das war nur ein Hinweis wie die Lösung zu formulieren ist. Der String out ermöglicht es in meinem Code durch Vertauschung von 2 Zeilen ganz einfach die gewünschte Reihenfolge zu ermöglichen. @Krön hat das bereits erkannt und hat meinen Code als für ihn die beste Antwort gekennzeichnet. ( Ein wenig selber denken lassen ist der Hintergrund dafür 😉 )
Das meinte ich ja, habe erst später gesehen dass krön das wieter oben schon selbst bemerkt hatte.

Klar kann man durch Tuschend er 2 Zeilen die Reihenfolge nach Belieben umdrehen was an und für sich shcon eine ziemlich geile Sache ist 🙂
 
Wenn ich es richtig verstanden habe, ist die "schönere Variante" rechtsbündige Ausgabe.

Noch schöner wäre nach meiner Meinung mittige Ausgabe.

Das wäre doch eine interessante Herausforderung.

Weiterhin könnten die Zahlen auch unterschiedliche Breiten haben. Das könnte man auch noch beachten.
Das wäre zumindest was, womit @Krön üben könnte 🙂
Das kommt evtl. in Rekursion Teil 2. 😀
Jetzt geht es weiter mit Klassen und Objekten.


Als Krönung Ausgabe nach HTML, PDF(über HTML-Hilfe) oder Ascii-Art.
Das überlasse ich lieber euch. 😉
 
Musst Du wissen. Allerdings glaube ich kaum, dass die Aufgabe für jemanden hier ein größeres Problem darstellen würde 😉 Im übrigen wäre das etwas für ein Clean Coding Dojo, bei dem man versucht, verhältnismäßig einfache Aufgaben immer wieder - und verschieden - zu lösen. Als Training.
 
Musst Du wissen. Allerdings glaube ich kaum, dass die Aufgabe für jemanden hier ein größeres Problem darstellen würde 😉 Im übrigen wäre das etwas für ein Clean Coding Dojo, bei dem man versucht, verhältnismäßig einfache Aufgaben immer wieder - und verschieden - zu lösen. Als Training.
Mal ganz ohne Witz, gibt es so Webseiten die so Qufgaben mit Lösungen haben?

Also wo , mit Schritt für Schritt schwierigeren Aufgaben, die verschiedenen Lösungsarten trainiert werden? 🙂
 
Mal ganz ohne Witz, gibt es so Webseiten die so Qufgaben mit Lösungen haben?
Mit Lösung? Keine Ahnung. Es gibt sogenannte Programming Katas (s. https://ccd-school.de/coding-dojo/) und manche stellen ihre Ansätze auf Github ein. Christian @Ullenboom hat gerade ein Trainingsbuch veröffentlicht (https://www.rheinwerk-verlag.de/captain-ciaociao-erobert-java/ - auf der Seite findest Du Auszüge), in dem Aufgaben gestellt und dann eine Lösung gezeigt, ggf. auch Alternativen diskutiert werden.
 

Neue Themen


Zurück
Oben