Leerzeichen zählen mit Rekursion

ThommyTom

Aktives Mitglied
Hallo!
Ich versuche grade die Rekursion zu verstehen und habe wollte mir deshalb mal ein Programm schreiben, dass Leerzeichen in einem String zählt. Natürlich mittels Rekursion.

Das bekomme ich aber einfach nicht hin, kann mir da jemand weiterhelfen?
Ich habe:
Java:
public int anzahlLeerzeichen(String s)
    {
        if(s.isEmpty())
        {
            return 0;
        }
        else 
        {
            int ergebnis = anzahlLeerzeichen(s.substring(1));
            if(s.substring(s.length() - 1).isEmpty())
            {
                return 1 + ergebnis;
            }
            else
            {
                return ergebnis;
            }
        }
    }

Ablaufen sollte es so:
anzahlLeerzeichen("a bc d")
-> 0 + anzahlLeerzeichen(" bc d")
-> 0 + (1 + anzahlLeerzeichen("bc d"))
-> 0 + (1 + (0 + anzahlLeerzeichen("c d")))
-> 0 + (1 + (0 + (0 + anzahlLeerzeichen(" d"))))
-> 0 + (1 + (0 + (0 + (1 + anzahlLeerzeichen("d")))))
-> 0 + (1 + (0 + (0 + (1 + (0 + anzahlLeerzeichen(""))))))
-> 0 + (1 + (0 + (0 + (1 + (0 + 0)))))
-> 0 + (1 + (0 + (0 + (1 + 0))))
-> 0 + (1 + (0 + (0 + 1)))
-> 0 + (1 + (0 + 1))
-> 0 + (1 + 1)
-> 0 + 2
-> 2

Ich danke euch!
LG
Thomas
 

ThommyTom

Aktives Mitglied
Java:
public int anzahlLeerzeichen(String s)
    {
         if(s.isEmpty())
         {
             return 0;
         }
         else 
         {
            if(s.substring(0,1).equals(" "))
            {
                return 1 + anzahlLeerzeichen(s.substring(1));
            }
            else
            {
                return anzahlLeerzeichen(s.substring(1));
            }
         }
    }

Das stimmt, oder?
 

rme

Top Contributor
Ja, das wäre eine mögliche Lösung :) Schön wäre es, wenn du die Rekursion endrekursiv hinbekommst, d.h. dafür sorgst, dass die Funktion im letzten Schritt immer in die Rekursion geht und dahinter nichts mehr kommt. Bei dir gibt es einen Fall, in dem du nach der Rekursion noch eine Addition durchführst - das ist in der Theorie der Rekursion nicht sehr elegant.
 
Zuletzt bearbeitet:

rme

Top Contributor
Java:
                return 1 + anzahlLeerzeichen(s.substring(1));

In diesem Fall muss die Rekursion abgewartet werden, bis die 1 addiert werden kann, d.h. es ist Speicher für die ganzen Zwischenwerte erforderlich. Das sieht man auch oben in deinem Rekursionsbaum ganz gut - wenn die letzte Stufe fertig ist, muss alles nochmal zurückgerechnet werden, bis das Ergebnis feststeht.

In Java ist sowas egal, weil es in Java keine Funktionen gibt und Java deshalb immer diesen Speicher benötigen wird. Aber in Sprachen, in denen es Funktionen gibt (Scala, Haskell, Erlang, OCaml, ML, ...), könntest du Zeit und Speicher sparen, wenn du das obige Problem beseitigst :)
 

ThommyTom

Aktives Mitglied
Achso okay ;)
Ich sollte es aber schon so implementieren, wie in dem Baum angegeben.
Ich denke trotzdem noch einmal drüber nach.

Eine Kleinigkeit noch zu regulären Ausdrücken:
[a-z] heißt ja genau ein Buchstabe aus der Menge.
Wenn ich jetzt z.B.
Klasse und K
scchreiben möchte, wie mache ich das?
[A-Z][a-z] geht ja nicht, weil ich so das K nicht hinbekomme. [] heißt genau einmal.
 

rme

Top Contributor
[abc] bedeutet ja, dass sowohl a, b und c erlaubt sind - Ein Trennzeichen ist nicht erforderlich. Deshalb sieht das merkwürdig aus, aber man macht es so: [A-Za-z]
 

ThommyTom

Aktives Mitglied
Und wenn ich ausschließen möchte, dass so ein Wort mit einem Kleinbuchstaben beginnt? Ich möchte die Menge aller großgeschriebenen Wörter haben.
[A-K][a-k]+ muss also irgendwie so ergänzt werden, dass [a-k] auch garnicht vorkommen kann. Oder heißt + genau das? Ich dachte aber, dass heißt mindestens einmal.

Und wie stellt man z.B. die Zahlen von 0 bis 255 dar? [0-255] wäre ja 0,1,2,5.
 

rme

Top Contributor
+ heißt "mindestens einmal". Du brauchst den *, der steht für "beliebig oft, einschließlich 0 mal"

Das Zahlenbeispiel lass ich dich selbst rätseln, wir wollen hier ja keine Hausaufgaben machen ;) Tipp: Vielleicht brauchst du da mehrere, durch ein Oder | kombinierte Fälle.
 
Zuletzt bearbeitet:

ThommyTom

Aktives Mitglied
Aber man kommt da mit [], +, * und | aus? Was genau macht das |? Erlaubt es auch, dass beides erfüllt ist oder ist es exklusiv?

Achja, und es sind keine Hausaufgaben ;)
 

rme

Top Contributor
Hier mal systematische Überlegungen dazu:

Erste Ziffer:
* wenn die Zahl dreistellig ist, darf die erste Ziffer nur 0, 1 oder 2 sein (falls führende Nullen erlaubt sein sollen)
* wenn die Zahl weniger als drei Ziffern hat, kann die erste Ziffer beliebig sein

Zweite Ziffer:
* wenn die Zahl dreistellig ist, darf die zweite Ziffer nur 0 - 5 sein

Dritte Ziffer:
* darf nur 0 - 5 sein

Der Gesamtaufbau ist also eine Fallunterscheidung, d.h. sieht so aus:

(ausdruck für einstellige Zahlen) | (ausdruck für zweistellige zahlen) | (ausdruck für dreistellige zahlen)

Das Oder erlaubt auch, dass beides erfüllt ist.
 

ThommyTom

Aktives Mitglied
Ich habe nun dies hier:
[0-9]|([0-9][0-9])|([0-2][0-5][0-5]|[0-2][0-4][0-9]|[01][0-9][0-9])

Das müsste eigentlich stimmen. Geht es auch einfacher? Ist ja doch recht lang.

Nun möchte ich aber noch (du ahnst es wohl schon) einen Ausdruck für IP-Adressen haben.
Das wäre dann
([0-9]|([0-9][0-9])|([0-2][0-5][0-5]|[0-2][0-4][0-9]|[01][0-9][0-9]))\.([0-9]|([0-9][0-9])|([0-2][0-5][0-5]|[0-2][0-4][0-9]|[01][0-9][0-9]))\.([0-9]|([0-9][0-9])|([0-2][0-5][0-5]|[0-2][0-4][0-9]|[01][0-9][0-9]))\.([0-9]|([0-9][0-9])|([0-2][0-5][0-5]|[0-2][0-4][0-9]|[01][0-9][0-9]))

Hab ich das unnötig kompliziert gemacht, oder geht es einfach nicht anders?
 

rme

Top Contributor
Es ist normal, dass reguläre Ausdrücke lang und unleserlich werden. Für die Zahl 0 bis 255 fällt mir intuitiv kein kürzerer ein. Für die IP-Adresse könnte man das abkürzen: Es gibt den Operator {a, b}, den man hinter einen Ausdruck schreiben kann - er sorgt dafür, dass der Ausdruck mindestens a mal und höchstens b mal vorkommen darf, z.B.:

[a-z]{2, 4} - 2 bis 4 Kleinbuchstaben

[0-9]{10} - genau 10 Ziffern

Dabei kann der zu wiederholende Ausdruck auch ein komplexer Ausdruck sein, dann einfach runde Klammern darum setzen, damit klar ist, was wiederholt werden darf.

Hier steht, was es noch alles gibt: Pattern (Java Platform SE 6)
 

VfL_Freak

Top Contributor
Moin,

habe gerade mal schnell in meiner SW hier geschaut ... ich prüfe so auf gültige IPs:
Java:
  /**
   * Überprüft einen übergebenen Text auf eine IP-Adresse (ohne führenden oder nachfolgenden Text) 
   * @param strIP4 Der Text
   * @return true -> IP-Adresse gefunden
   */
  public static boolean validateIP4OhneText(String strIP4){
    boolean bResult = false;
    if (strIP4 == null)
    {
      return bResult;
    }
   	Pattern p = Pattern.compile("^[0-9]{1,3}[.]{1}[0-9]{1,3}[.]{1}[0-9]{1,3}[.]{1}[0-9]{1,3}$");
   	Matcher m = p.matcher(strIP4);
   	if( !m.find( ))
   	{
   		bResult = false;
   	} 
   	else 
   	{
   		bResult = true;
   	}
    return bResult;
  }
Müsste doch das sein, was Du suchst, oder ?

Gruß
Klaus
 

VfL_Freak

Top Contributor
ok, guter Einwand .... :autsch:

Habe es mir gerade mal angeschaut.
Das liegt hier bei mir daran, dass mit dieser Methode quasi nur geschaut werden soll, ob es eine IP ist oder nicht! Die Prüfung, ob die einzelnen Blöcke im Bereich 0-255 liegen, macht scheinbar nur das vorgelagerte Programm, dass mir ggf. auf Anfrage eine konkrete IP liefert ...

Sorry, war dann auf die Schnelle wohl doch nicht so hilfreich, wie ich dachte. Ich habe dieses Projekt erst vor einiger Zeit übernommen und mich noc nicht mit allen Teilbereichen so intensiv beschäftigt, wie es sein sollte ... wußte nur, dass es so eine Methode gab!

Gruß
Klaus
 

nvidia

Bekanntes Mitglied
Um noch mal etwas zum eigentlichen Thema zu posten, bei dem es nicht um reguläre Ausdrücke ging.

Java:
public final class ZaehleZeichenBeispielRekursiv {
	public static int zaehleLeerzeichen(String quelle){
		return zaehleZeichen(quelle,' ');
	}
	
	private static int zaehleZeichen(String quelle, char zeichen) {
		return loop(quelle, zeichen, quelle.length()-1, 0);
	}

	private static int loop(String quelle, char zeichen, int aktuellePosition, int anzahl) {
		if(aktuellePosition < 0){
			return anzahl;
		}
		
		if(quelle.charAt(aktuellePosition) == zeichen){
			anzahl++;
		}
		
		return loop(quelle, zeichen, aktuellePosition-1, anzahl);
	}

	public static void main(String[] args) {
		System.out.println(zaehleLeerzeichen(" a b "));
	}
}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Zeichen zählen ohne Leerzeichen Java Basics - Anfänger-Themen 3
melaniemueller setCharAt Leerzeichen zusätzlich einfügen Java Basics - Anfänger-Themen 8
A 1 Leerzeichen durch zwei Leerzeichen ersetzen Java Basics - Anfänger-Themen 4
HolyFUT Input/Output Leerzeichen aus String entfernen - klappt nicht! Java Basics - Anfänger-Themen 13
T Leerzeichen im String entfernen Java Basics - Anfänger-Themen 6
A Löschen von Leerzeichen in einem char array ohne methoden Java Basics - Anfänger-Themen 6
M Warum werden character, die Leerzeichen sind, nicht korrekt verarbeitet? Java Basics - Anfänger-Themen 2
B String nach erstem Leerzeichen trennen Java Basics - Anfänger-Themen 7
O Methode über Leerzeichen Java Basics - Anfänger-Themen 13
D jsoup get class name mit leerzeichen Java Basics - Anfänger-Themen 7
O String Methode für längste Sequenz von Leerzeichen Java Basics - Anfänger-Themen 35
J am Anfang eines String ein Leerzeichen löschen Java Basics - Anfänger-Themen 6
J Leerzeichen im Pfad automatisch erkennen Java Basics - Anfänger-Themen 30
D Leerzeichen entfernen Java Basics - Anfänger-Themen 4
P Java Leerzeichen in der Ausgabe entfernen Java Basics - Anfänger-Themen 3
Phillip Leerzeichen nach Zahlen bei Ausgabe Java Basics - Anfänger-Themen 6
I Bei Umlauten und Leerzeichen im Pfad, wird Datei nicht gefunden Java Basics - Anfänger-Themen 5
M (Leerzeichen) zu einem gesuchten String Java Basics - Anfänger-Themen 4
S Leerzeichen zwischen zwei Zeichen im String entfernen Java Basics - Anfänger-Themen 19
C Aus einer Textdatei Zahlen lesen mit Leerzeichen Java Basics - Anfänger-Themen 11
P Leerzeichen in Pfad... Java Basics - Anfänger-Themen 17
H String mit Leerzeichen in Variablen zerlegen Java Basics - Anfänger-Themen 4
M String vergleichen - Leerzeichen Ignorieren? Java Basics - Anfänger-Themen 4
M nach Typenkonvertierung Leerzeichen ersetzen Java Basics - Anfänger-Themen 2
J Alle Leerzeichen aus String entfernen Java Basics - Anfänger-Themen 13
P int-Werte im String (mit Hilfe vom Leerzeichen) trennen? Java Basics - Anfänger-Themen 2
S Leerzeichen herausfiltern Java Basics - Anfänger-Themen 10
T Zeichen als Leerzeichen weitergegeben Java Basics - Anfänger-Themen 13
D Hilfe beim einlesen eines Strings mit Leerzeichen Java Basics - Anfänger-Themen 16
G Multiple Leerzeichen entfernen Java Basics - Anfänger-Themen 13
C Leerzeichen im char Array setzen Java Basics - Anfänger-Themen 33
C Stringeingabe: kein Satz wegen Leerzeichen möglich Java Basics - Anfänger-Themen 3
D Erste Schritte RandomAccessFile "Leerzeichen" löschen Java Basics - Anfänger-Themen 6
T Erste Schritte Eingelesenen Satz - Wörter und Leerzeichen getrennt in 2x Array's Java Basics - Anfänger-Themen 7
G Leerzeichen einfügen Java Basics - Anfänger-Themen 3
3 Leerzeichen erkennen Java Basics - Anfänger-Themen 3
F Leerzeichen zwischen jeden Buchstaben eines Strings einfügen Java Basics - Anfänger-Themen 16
D Wort nach Leerzeichen - String Java Basics - Anfänger-Themen 10
X nach split leerzeichen weg Java Basics - Anfänger-Themen 4
K Int Array mit "Leerzeichen" füllen Java Basics - Anfänger-Themen 2
D mehrere Leerzeichen durch 1 Leerzeichen ersetzen Java Basics - Anfänger-Themen 3
M property-Datei: key mit Leerzeichen? Java Basics - Anfänger-Themen 3
A Leerzeichen bei Ausgabe? Java Basics - Anfänger-Themen 3
N java.util.Arrays.sort Warum sind Leerzeichen vor alphabetischen Zeichen sortiert? Java Basics - Anfänger-Themen 12
C mehrere Leerzeichen zwischen Strings Java Basics - Anfänger-Themen 4
P Probleme mit Runtime.exec und Leerzeichen Java Basics - Anfänger-Themen 15
G String in Array einfügen, leerzeichen! Java Basics - Anfänger-Themen 2
S regular expression - bekomme leerzeichen nicht raus Java Basics - Anfänger-Themen 3
O Leerzeichen aus Java Basics - Anfänger-Themen 11
P Leerzeichen-Problem bei Verzeichnispfad Java Basics - Anfänger-Themen 7
O Leerzeichen im Pfad Java Basics - Anfänger-Themen 8
M wie auf ein feld mit leerzeichen in einem char array prüfen? Java Basics - Anfänger-Themen 4
B Woerter, Zeichen, Leerzeichen zaehlen - Problem Java Basics - Anfänger-Themen 3
G Leerzeichen in String einfügen Java Basics - Anfänger-Themen 1
H wie spreche ich durch leerzeichen im string neuen index an Java Basics - Anfänger-Themen 10
F Leerzeichen in Pfadangabe beim Befehl exec() Java Basics - Anfänger-Themen 5
G Split Operation: ein oder mehrere Leerzeichen Java Basics - Anfänger-Themen 7
padde479 Runtime.getRuntime.exec() Leerzeichen unterdrücken Java Basics - Anfänger-Themen 2
M Leerzeichen löschen Java Basics - Anfänger-Themen 2
F Leerzeichen in Integer Array speichern Java Basics - Anfänger-Themen 7
I String mit Leerzeichen einlesen Java Basics - Anfänger-Themen 3
D Abfrage auf Leerzeichen Java Basics - Anfänger-Themen 5
G Im Zeichenarray Leerzeichen invertieren Java Basics - Anfänger-Themen 5
G String mit next()-Methode einlesen - keine Leerzeichen! Java Basics - Anfänger-Themen 11
S Problem beim setzen von JAVA_HOME (Leerzeichen?) Java Basics - Anfänger-Themen 7
R Am Begin und Ende eines Strings die Leerzeichen löschen ? Java Basics - Anfänger-Themen 3
M Leerzeichen in Dateinamen ein Problem ? Java Basics - Anfänger-Themen 4
F Leerzeichen in einen String einfügen. Java Basics - Anfänger-Themen 15
D ausgabe verändern (statt zeilenumbruch leerzeichen) Java Basics - Anfänger-Themen 2
S Einen langen String beim Leerzeichen in zwei Strings zerlege Java Basics - Anfänger-Themen 3
S txt-Datei nach Leerzeichen Splitten lassen! Java Basics - Anfänger-Themen 3
S Leerzeichen replacen Java Basics - Anfänger-Themen 5
F Problem mit Zeichenkette nur aus Leerzeichen Java Basics - Anfänger-Themen 4
T String Leerzeichen wegschneiden Java Basics - Anfänger-Themen 2
L Leerzeichen erfragen Java Basics - Anfänger-Themen 4
L Steuerzeichen für Space (Leerzeichen)? Java Basics - Anfänger-Themen 3
J Dateipfad mit Leerzeichen Java Basics - Anfänger-Themen 10
C Leerzeichen aus String entfernen Java Basics - Anfänger-Themen 8
A replaceAll und Leerzeichen Java Basics - Anfänger-Themen 2
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
M Häufigkeit von Wörtern zählen Java Basics - Anfänger-Themen 6
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
D spezifische Knoten in einem Baum zählen Java Basics - Anfänger-Themen 9
F Werte in einer Arraylist Zählen Java Basics - Anfänger-Themen 2
S Java Methodenaufrufe zählen Java Basics - Anfänger-Themen 4
P Doppelte werte in einer Liste zählen Java Basics - Anfänger-Themen 11
S Methoden Methodenaufruf rekursiv zählen Java Basics - Anfänger-Themen 4
J Methoden Positive Werte zählen Java Basics - Anfänger-Themen 3
H Buchstaben zählen Java Basics - Anfänger-Themen 9
Poppigescorn Häufigkeit einer zahl zählen Java Basics - Anfänger-Themen 5
HighLife Bestimmte Werte aus Array zählen Java Basics - Anfänger-Themen 15
O Attribute die Methoden zählen Java Basics - Anfänger-Themen 5
X Game of Life Nachbarn zählen Java Basics - Anfänger-Themen 20
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
Z Satz aufteilen und die Wörter zählen (HashMap) Java Basics - Anfänger-Themen 15
S Binärbäume knoten zählen Java Basics - Anfänger-Themen 16
K Counts zählen Java Basics - Anfänger-Themen 23
Kirby.exe Anzahl vorkommender Elemente im Array zählen Java Basics - Anfänger-Themen 9
J Zeichen im String zählen Java Basics - Anfänger-Themen 3
G Binärer Suchbaum Knoten zählen Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben