den String auf Buchstabe überprüfen?

4 Antworten

Die Antwort von regex9 ist soweit in Ordnung. Wobei sich zwangsläufig zwei Fragen stellen:

  1. Wieso sprichst du von rekursiv?
  2. Was genau ist dein Ziel?

Geht es dir um eine akademische Aufgabe? Oder hast du dich falsch ausgedrückt? Eine Rekursion, wie regex9 sie beschreibt, ist aus Sicht eines Algorithmus völliger Unfug, denn das, was da gemacht wird, hat mit Rekursion absolut nichts zu tun.

Es gibt deutlich einfachere Programmkonstrukte, beispielsweise eine einfache For-Schleife. Natürlich erfüllt das deine Frage nach Rekursion nicht, aber es löst die Aufgabenstellung "Prüfe, ob Buchstabe im String vorkommt."

Davon abgesehen gibt es gerade für solche Fragestellungen sowieso bereits vorbereitete Methoden. Beim Java-String beispielsweise die Methode "contains"...

Wenn du jedoch eine Rekursion benötigst, weil du beispielsweise eine Art Baum hast, indem du etwas finden möchtest, ist wiederum der Ansatz von regex möglich. Eine Alternative wären dann aber auch Java Streams.


regex9  06.02.2018, 16:39
(...) denn das, was da gemacht wird, hat mit Rekursion absolut nichts zu tun.

Womit begründest du das? Die rekursive Definition ist doch erfüllt.

0
mepeisen  06.02.2018, 16:59
@regex9

Ich meinte dass die Frage "Enthält ein String einen Buchstaben" normalerweise nichts mit Rekursion zu tun hat. Klar, es funktioniert so und deine Antwort ist bezogen auf die Frage des TE auch vollkommen richtig. Deswegen auch eine gute Bewertung von mir.

Aber wer guten Code schreiben will, der sollte auf solche "Spielereien" verzichten und einfache Wege wählen. Gut im Sinne von: Andere verstehen es beim Draufschauen und vor allem: Man selbst versteht es in 3 Jahren ebenfalls noch.

Mir ging es in der Antwort darum, zu hinterfragen., wo der Ansatz herkommt, diese Aufgabe überhaupt mittels Rekursion lösen zu wollen. Für eine akademische Diskussion in der Schule oder an der Uni kann man das mal betrachten. Aber mit gutem Programmierstil hat das IMHO nichts zu tun. Das ist als ob man den Spatzen mit einer Atombombe zerlegen will. Geht, aber muss nicht wirklich sein :-)

0
mepeisen  06.02.2018, 21:18
@regex9

Noch eine Randnotiz. Bei einem String von sagen wir 50k Länge, bei dem der Buchstabe nicht vorkommt, würde er 50tsd, hätten wir hier 50tsd Stackframes am Ende durch die Rekursion. Je nach Konfiguration und eingestelltem Heap macht eine VM das vielleicht sogar mit. Ein einfaches Programm hat bei mir gerade bei index 5618 die Grätsche gemacht :-)

0

Ich verstehe zwar nicht, weshalb das rekursiv sein sollte, denn der iterative Code wird hier relativ unschön simuliert, trotzdem ist es natürlich möglich, folgendermaßen:

public static void main(String[] args) {
		String wort = "Barbara";
		char buchstabe = 'r';
		System.out.println(buchstabensuchmethode(wort, buchstabe, 0));

	}

	public static boolean buchstabensuchmethode(String wort, char buchstabe, int i) {

		if (i < wort.length()) {

			if (wort.charAt(i) == buchstabe) {

				return true;

			}

			return buchstabensuchmethode(wort, buchstabe, i + 1);

		} else {
			return false;
		}

	}

Woher ich das weiß:Berufserfahrung – Programmierer

Baue dir erst einen Algorithmus, der das Problem löst. Wenn du es einfacher findest, dann erst iterativ.

Pro Aufruf musst du alle notwendigen Daten weitergegeben.

  • Die Zeichenkette, die zu durchlaufen ist (alternativ das Character-Array)
  • Den aktuellen Character oder Index
  • Den Character, den es zu überprüfen gibt

Zudem benötigt dein Code eine Abbruchbedingung, damit du weißt, wann der String durchlaufen wurde.

In Pseudo-Code könnte es so aussehen:

bool contains(haystack, needle, index)
  if (haystack.length == index)
    return false
  return haystack[index] == needle || contains(haystack, needle, index + 1)

Du könntest immer das erste Zeichen überprüfen und solange die Zeichenzahl größer als 1 ist, alles außer dem ersten Zeichen rekursiv übergeben.

Die Vergleichsergebnisse verknüpfst du oder. Sobald der Buchstabe mindestens einmal gefunden wurde, bekommst du am Ende true zurück geliefert.

Du kannst natürlich die Rekursion vorzeitig verlassen, sobald ein Match vorliegt.

Woher ich das weiß:Berufserfahrung – Programmierer