Rekursion: Rechenmauer mit Array erstellen

K

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
Blender3D
Über Vorschläge würde ich mich sehr freuen.
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[i];
            values[i-1] = values[i-1]+values[i];
        }
        System.out.println(out);
        printMathWall(values, end-1);
    }
}
B

Barista

Top Contributor
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.
 
Blender3D

Blender3D

Top Contributor
Über Vorschläge würde ich mich sehr freuen.
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[i];
            values[i-1] = values[i-1]+values[i];
        }
        System.out.println(out);
        printMathWall(values, end-1);
    }
}
 
Beste Antwort
K

Krön

Mitglied
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:
kneitzel

kneitzel

Top Contributor
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.
 
K

Krön

Mitglied
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?
 
kneitzel

kneitzel

Top Contributor
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)
 
K

Krön

Mitglied
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. 😀
 
B

Barista

Top Contributor
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.
 
B

berndoa

Bekanntes Mitglied
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[i];
            values[i-1] = values[i-1]+values[i];
        }
        System.out.println(out);
        printMathWall(values, end-1);
    }
}
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 :)
 
Blender3D

Blender3D

Top Contributor
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 ;) )
 
B

berndoa

Bekanntes Mitglied
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 :)
 
K

Krön

Mitglied
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. 😉
 
mihe7

mihe7

Top Contributor
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.
 
B

berndoa

Bekanntes Mitglied
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? :)
 
mihe7

mihe7

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Rekursion einer Zahlenfolge (Ab- und Aufzählung) Java Basics - Anfänger-Themen 6
Zeppi Rekursion Java Basics - Anfänger-Themen 15
V Backtracking und Rekursion Java Basics - Anfänger-Themen 15
L REKURSION Java Basics - Anfänger-Themen 13
Kirby.exe Rekursion Java Basics - Anfänger-Themen 7
N for Schleife durch Rekursion ersetzen Java Basics - Anfänger-Themen 6
X Rekursion Java Basics - Anfänger-Themen 3
H Rekursion Java Basics - Anfänger-Themen 2
D Erste Schritte Rekursion Java Basics - Anfänger-Themen 13
M Rekursion Tage Ansteckung gesamte Bevölkerung Java Basics - Anfänger-Themen 15
M Java Rekursion Java Basics - Anfänger-Themen 9
G Java Rekursion Java Basics - Anfänger-Themen 5
J Rekursion Klausur Aufgabe Java Basics - Anfänger-Themen 2
N Rekursion Java Basics - Anfänger-Themen 18
M Verständnisproblem der Rekursion bei Arrays Java Basics - Anfänger-Themen 8
X Rekursion Rätsel Java Basics - Anfänger-Themen 4
N Klassen Rekursion mit Feldern von Objekten Java Basics - Anfänger-Themen 14
W Rekursion Java Basics - Anfänger-Themen 0
D Konsolenausgabe Zahlenfolge Rekursion Java Basics - Anfänger-Themen 3
J Ping Pong Methode mit Rekursion Java Basics - Anfänger-Themen 1
N Rekursion Java Basics - Anfänger-Themen 1
B Rekursion Basic Java Basics - Anfänger-Themen 15
O Rekursion Mergesort Java Basics - Anfänger-Themen 18
G Rekursion Java Basics - Anfänger-Themen 20
M Rekursion Java Basics - Anfänger-Themen 7
F Hilfe bei Rekursion... Java Basics - Anfänger-Themen 4
A Mit Rekursion Zufallszahlen erstellen und größte finden Java Basics - Anfänger-Themen 5
B Rekursion Wurzel Java Basics - Anfänger-Themen 39
O Rekursion ordentlich aufschreiben Java Basics - Anfänger-Themen 2
B Rekursion verstehen Java Basics - Anfänger-Themen 4
O Rekursion Java Basics - Anfänger-Themen 2
E Rekursion verstehen. Java Basics - Anfänger-Themen 4
E Rekursion Kisten befüllen Java Basics - Anfänger-Themen 10
E Rekursion verstehen Java Basics - Anfänger-Themen 2
O Rekursion, String Java Basics - Anfänger-Themen 8
N Invertierte Rekursion??? Java Basics - Anfänger-Themen 5
M Bitte um Hilfe bei Quellcode (Rekursion) Java Basics - Anfänger-Themen 6
T Rekursion Warum bricht meine Funktion nicht ab Java Basics - Anfänger-Themen 4
A Hilfe bei Rekursion,Ich verstehe nicht,wie funktioniert die Rekursion in der Methode "walk" Java Basics - Anfänger-Themen 13
L Rekursion im Baum Java Basics - Anfänger-Themen 9
E Pfade eines Baums angeben ohne Rekursion Java Basics - Anfänger-Themen 20
L Rekursion Baumknoten Java Basics - Anfänger-Themen 8
L Rekursion größtes Zeichen Java Basics - Anfänger-Themen 8
L Rekursion Modulo Java Basics - Anfänger-Themen 7
I Rekursion Java Basics - Anfänger-Themen 11
H Rekursion Java Basics - Anfänger-Themen 7
N Methoden zur Rekursion (catalansche Zahlen) Java Basics - Anfänger-Themen 4
S Frage zu Rekursion... Java Basics - Anfänger-Themen 15
N Java catalansche Zahlen (Rekursion) Java Basics - Anfänger-Themen 5
S Noch eine Frage zur Rekursion... Java Basics - Anfänger-Themen 11
S Frage zu einer Rekursion Java Basics - Anfänger-Themen 15
F Methoden Abbruchbedingung bei Rekursion Java Basics - Anfänger-Themen 2
Z Rekursion Primzahlen Java Basics - Anfänger-Themen 1
K Rekursion Verständnisfrage Java Basics - Anfänger-Themen 19
L Methoden Rekursion gibt alten Wert wieder Java Basics - Anfänger-Themen 37
M Rekursion Minimums Suche Java Basics - Anfänger-Themen 12
J Rekursion Java Basics - Anfänger-Themen 5
F Aufgabe Rekursion Binärer Baum Java Basics - Anfänger-Themen 15
N Rekursion Java Basics - Anfänger-Themen 2
B Rekursion - Übung Java Basics - Anfänger-Themen 2
B Problem beim grundsätzlichen Verständnis bei Rekursion mit 2-dimensionalen Array Java Basics - Anfänger-Themen 6
P Rekursion Java Basics - Anfänger-Themen 19
G Rekursion Beispiel Java Basics - Anfänger-Themen 3
M Rekursion schreiben Java Basics - Anfänger-Themen 16
A Rekursion Funktion in eine Iterativ Funktion umwandeln Java Basics - Anfänger-Themen 9
T Array Rekursion Java Basics - Anfänger-Themen 1
B lineare und schlichte Rekursion Java Basics - Anfänger-Themen 1
A Rekursion Java Basics - Anfänger-Themen 2
B Rekursion Java Basics - Anfänger-Themen 3
A Rekursion stoppt an der falschen Stelle Java Basics - Anfänger-Themen 4
A Lineare Rekursion Java Basics - Anfänger-Themen 6
P Hilfe zur Rekursion? Java Basics - Anfänger-Themen 2
B Rekursion Schneeflocke - Kurze Frage zur Methode Java Basics - Anfänger-Themen 11
L Rekursion Java Basics - Anfänger-Themen 4
S Rekursion Rückgabe - Türme von Hanoi Java Basics - Anfänger-Themen 16
kilopack15 Rekursion und Schleifen Java Basics - Anfänger-Themen 27
E Rekursion Java Basics - Anfänger-Themen 10
JavaXava rekursion nicht verstanden Java Basics - Anfänger-Themen 5
K Rekursion-Verständnisfrage Java Basics - Anfänger-Themen 4
E Methoden String wird in Rekursion nicht überschrieben Java Basics - Anfänger-Themen 2
T 2fach Rekursion. Java Basics - Anfänger-Themen 4
N Rekursion mit if-Anweisung Java Basics - Anfänger-Themen 10
K Methoden Zahlensysteme umwandeln mittels Rekursion Java Basics - Anfänger-Themen 5
H Rekursion Binäre Suche Java Basics - Anfänger-Themen 2
P Methoden Primzahltest mit Rekursion Java Basics - Anfänger-Themen 3
C Rekursion überführen in eine normale methode Java Basics - Anfänger-Themen 1
M Methoden Rekursion nachvollziehen Java Basics - Anfänger-Themen 4
C Rekursion Java Basics - Anfänger-Themen 6
B Rekursion - Variable initialisieren Java Basics - Anfänger-Themen 2
B Rekursion von Hand durchführen Java Basics - Anfänger-Themen 2
Z Rekursion Java Basics - Anfänger-Themen 4
C Rekursion auf einem Array(negative werte addieren) Java Basics - Anfänger-Themen 4
O Methoden rekursion Java Basics - Anfänger-Themen 7
P Rekursion mit 2 Aufrufen Java Basics - Anfänger-Themen 4
J Hilfe! Rekursion Java Basics - Anfänger-Themen 28
A Rekursion, Anzahl von Stellen ausgeben Java Basics - Anfänger-Themen 7
A Rekursion (anhand von Mergesort) nachvollziehen Java Basics - Anfänger-Themen 4
E Erste Schritte Verschiedene Anfängerfragen (Rekursion, Terminierung, Schleife, etc.) Java Basics - Anfänger-Themen 5
A Frage zur Rekursion Java Basics - Anfänger-Themen 8
D Klausur Vorbereitung: Listen, Rekursion, Bäume & Vererbung Java Basics - Anfänger-Themen 3

Ähnliche Java Themen


Oben