Java: Rekursion mit String-Methoden?

3 Antworten

Rekursiv ist es weil die Methode sich selbst aufruft.

Naja, bei rekursiven Methoden würde ich von hinten Rangehen. Ein wort mit 0 oder einem Zeichen ist immer ein palindrom. Das sind schonmal die fälle in denen du die rekursion abbrechen kannst. Dann überlegst du was du du bei 2 oder mehr Zeichen machen musst um auf rekursion zu prüfen.

Man muss ziemlich abstrakt denken für sowas.


Jens2244 
Beitragsersteller
 07.09.2020, 21:16

Danke, ich wollte noch fragen, warum das so lange geht bis sich das Wort spiegelt. Sollte die Methode nicht unendlich weitergehen?

0
jort93  07.09.2020, 21:35
@Jens2244

Nein, wegen diesem Teil

if(wort.length()<= 1)
return wort;

da hört die rekursion auf.

0
Jens2244 
Beitragsersteller
 07.09.2020, 21:48
@jort93

Ah okay dankd, ich verstehe aber nicht so ganz, warum sich die Wlrter spiegeln.

Beispiel: der wird zu red

Aber: bei mir wird der zu erd (weil nur der Bereich 1-2 angezeigt wird und der Buchstabe an der Stelle 0 hintendrangesetzt wird) und das wird zu rde (weil nur der Bereich 1-2 angezeigt wird und der Buchstabe an der Stelle 0 hintendrangesetzt wird).

0
Jens2244 
Beitragsersteller
 07.09.2020, 21:56
@Jens2244

Die Frage hat sich geklärt, ich habe vergessen, dass die Buchstaben erst wieder erscheinen wenn das Wort ein Buchstabe lang ist.

0
jort93  07.09.2020, 22:02
@Jens2244

Sagen wir du rufst die Methode auf der auf.

Dann läuft das so:

wasTuelch(der)

wasTuelch(er) + d

wasTuelch(r) + e

r(weil length<=1)

Dann kommt red dabei raus.

0
warum die Methode rekursiv ist

Na weil sie sich offenbar selbst aufruft. Das ist mehr oder weniger die Definition von Rekursion.

und wie man einen Palindromtester (Palindrom: ein Wort, das gespiegelt die gleiche Bedeutung hat) einbauen kann

Ich weiß nicht, was mit "einbauen" gemeint ist.

Rein rekursiv: Überleg dir, was das kürzestmögliche Palindrom ist. Dann überleg dir, wie sich ein längeres Palindrom aus diesem aufbauen lässt. Und damit hast du praktisch schon den Lösungsweg.

Oder du baust ihn mit Hilfe der Funktion, die du da gezeigt hast. Das ist dann ein Einzeiler. Vermutlich ist das gemeint.


Jens2244 
Beitragsersteller
 07.09.2020, 21:40

Ich komme irgendwie nicht weiter: Ein Palindrom muss beim Spiegeln gleich sein, daher gilt:

Erster Buchstabe und letzter müssen gleich sein. Zweiter und vorletzter, dritter und vorvorletzter etc. (wenn das Wort so lang ist).

Ursprünglich wollte ich eine if Bedingung haben mit

if(wort.equals(wasTueIch)) klappt aber nicht, da es keine Variable ist und

if(wort.equals((wort.substring(1,wort.length()))+wort.charAt(0))) klappt nicht, da dies nicht so häufig wiederholt wird, denn es wird die Methode nicht neu ausgerufen.

0
alfredo153  07.09.2020, 22:02
@Jens2244
if(wort.equals(wasTueIch)) klappt aber nicht, da es keine Variable ist

Ja. Es ist eine Funktion. Also verwende es wie eine Funktion.

0
Jens2244 
Beitragsersteller
 07.09.2020, 22:44
@alfredo153

Könntest du mir die Lösung sagen, ich habe es seit 20 Min. versucht und dabei ist gar nichts rumgekommen...

0
alfredo153  07.09.2020, 22:53
@Jens2244

Wie bekommst du die Umkehrung eines Strings, als String?


wasTueIch(wort)

Wie vergleichst du zwei Strings, mit einem boolschen Resultat?

wort.equals(andererString)

Also setzen wir das obige ins untere ein und wir haben den Ausdruck.

wort.equals(wasTueIch(wort))
0
Jens2244 
Beitragsersteller
 08.09.2020, 07:10
@alfredo153

Ich habd dies bereits gestern eingetippt, aber bei mir kommt eine Fehlermeldung.

0
alfredo153  08.09.2020, 07:14
@Jens2244

Tja, ohne zu wissen was du wo und wie getippt hast, und was die Fehlermeldung ist...

0
Jens2244 
Beitragsersteller
 08.09.2020, 07:37
@alfredo153

if (wort.equals(wasTueIch(wort))){.....

unreachable Statement wird mir hier ausgegeben.

0
alfredo153  08.09.2020, 07:40
@Jens2244

Dann hast du den obigen Code an eine Stelle hingeschrieben, wo das Programm nie ausgeführt wird.

0

Sie ist rekursiv, weil sie sich selbst aufruft...

Den Palindromtest:

newString = new StringBuffer(oldString).reverse().toString();