Rekursiv Vokale zählen

Status
Nicht offen für weitere Antworten.

tanjaHS

Mitglied
Hallo Leute,

ich muss in den Übungsaufgaben Vokalen zählen, das ganze aber rekursiv. Dazu habe ich folgendes programmiert. Was aber mir ein OutOfBound Exception liefert, wieso weiss ich nicht ? Könnt ihr bitte mir helfen ?


Code:
public static int zaehleVokale(String derString, int l, int vokale) {
		
		if(l == 0)
			return 0;
		else if( l == 1 && derString == "a" || derString == "e "
			|| derString == "i" || derString == "o" || derString == "u")
			return 1;
		else if(l > 1)
			if(derString.charAt(l) == 'a'|| derString.charAt(l) == 'e' || derString.charAt(l) == 'i'
				|| derString.charAt(l) == 'o' || derString.charAt(l) == 'u')
			zaehleVokale(derString, l-1, vokale+1);
			else
				zaehleVokale(derString, l-1, vokale);
			
		return vokale;
		
	}
	
	
	public static void main(String[] args) {

		int vokale = 0;
		String derString = "Rettungsdienst";
		int laenge = derString.length();
		println(zaehleVokale(derString, laenge, vokale));

	}
 
Zuletzt bearbeitet:

faetzminator

Gesperrter Benutzer
Du bist wohl C Programmierer, was?
Ein paar Verbesserungsvorschläge:
1. warum übergibst du von main() die Länge des Strings?
2. bei l == 1 nicht mit == Strings vergleichen, sondern mit .equals()
3. ein Array von der Länge l besitzt die Indexes 0 - (l-1), du versuchst aber auf l zuzugreifen.
4. Mach doch eine 2. Methode, welche das 0 der Vokale übergibt
5. Rekursion ist meist relativ unschön.
Das sollte für den Anfang reichen :)
 

23

Bekanntes Mitglied
Rekursion ist absoult toll!!

Auf die schnelle:

Java:
	public static void vokRek(String x, int i) {
		
		if(i >= x.length())
			return;
		
		if(x.charAt(i) == 'a' || x.charAt(i) == 'e' || x.charAt(i) == 'i' ||
				x.charAt(i) == 'o' || x.charAt(i) == 'u') {
			
			System.out.print(x.charAt(i));
			
		}
		
		vokRek(x, ++i);
		
	}

Aufruf: vokRek("hallo wie gehts?u",0);
 

Marco13

Top Contributor
1. warum übergibst du von main() die Länge des Strings?
Weil des String von hinten durchsucht werden soll - das l ist der Index, an dem der Vokal-check gemacht wird. Das ist auch der Grund für die Exception. Bei l=2 wird auf index 2 zugegriffen, obwohl es nur bis index l-1 geht, wie du auch schon unter 3. gesagt hast.

2. bei l == 1 nicht mit == Strings vergleichen, sondern mit .equals()
Wobei man auch dort charAt(0) verwenden könnte.

5. Rekursion ist meist relativ unschön.

Aber manche Aufgaben sind nur damit elegant lösbar (z.B. Backtracking et al).

Es fehlen aber noch "return"s im (l > 1)-Fall...
 

0x7F800000

Top Contributor
Abgesehen davon, dass dies eine relativ relative Aussage war, bin ich ein Schweizer :D
Ne, wo du konkret herkommst ist nicht so entscheidend, aber zu deiner verstörenden Aussage :lol: über die Rekursion ist mir irgendwie nichts besseres eingefallen :oops:

Rekursion ist doch toll, versuche sonst mal irgendwelche klassisch rekursiven algos (sortierung mit mergesort, dfs auf graphen wie etwa auflistung von dateien in unterverzeichnissen oder zeichnen der gui-componenten, einfaches top down parsing usw...) iterativ umzuschreiben: da kommst du doch in schleifen und stacks um ;)
 

Landei

Top Contributor
Code:
if(x.charAt(i) == 'a' || x.charAt(i) == 'e' || x.charAt(i) == 'i' || x.charAt(i) == 'o' || x.charAt(i) == 'u'){...}

Meint ihr das ernst???

Warum zum Geier nicht das:

Code:
if("aeiou".contains(x.charAt(i))){...}
 

Schandro

Top Contributor
an den TO:
Man sollte immer {...} Blöcke nach if, for, switch usw... statements benutzen. Wenn danach nur eine Anweisung kommt, kann man die { } zwar theoretisch weglassen, es verstöst aber erstens gegen die Coding Convention und zweitens ist es eine potentielle Fehlerquelle...

Außerdem: Es ist schöner wenn innerhalb des algorithmus nicht die gesuchten zeichen ansich vorkommen, sondern man eine externes "Datenquelle" hat, z.b. ein Array als Membervariable der Klasse auf das er zugreift. Dadurch muss der Algorithmus ansich nicht geändert werden wenn er plötzlich was anderes suchen soll als Vokale.
 
Zuletzt bearbeitet:
J

JohannisderKaeufer

Gast
Um Vokale in einem String zu zählen, möchte man in der Regel eine Methode haben, die nur den Parameter String übergeben bekommt. Alles andere verleitet dazu unfug zu machen. Der Code des TO liefert für zaehleVokale("Bla",0,0) nicht unbedingt das gewünschte Ergebnis. Und derjenige der die Methode verwendet, ist nicht unbedingt derselbe der die Methode geschrieben hat.

Bei Rekursion ist es nicht das Hauptziel Variablen zum iterieren mitzuschleppen. Bei Rekursion, sollte man an Head und Tail denken, nicht wie ich Variablen mitschleppe um zu wissen wo ich gerade bin.

Java:
package vokaleZaehlen;

public class VokaleZaehler {

	public static int zaehleVokale(String string) {
		if(string.length()==0){
			return 0;
		}
		if (string.length() == 1) {
			if ("aieou".contains(string.toLowerCase())) {
				return 1;
			} else {
				return 0;
			}
		}
		return zaehleVokale(string.substring(0, string.length() / 2))
				+ zaehleVokale(string.substring((string.length() / 2)));
	}

	public static void main(String[] args) {
		String[] strings = { "a", "z", "az", "zzz", "azo", "zzzz","aaaa","aeiou s" ,""};
		for (String current : strings) {
			System.out.println(current + " " + zaehleVokale(current));
		}
	}
}
 

Marco13

Top Contributor
Sowohl bei den Aussagen als auch beim Code stimme ich mal weitgehend zu - bis auf eine Kleinigkeit: Dieses "Divide and Conquer" ist IMHO überflüssig....

Und ansonsten...
Code:
    public static int countVowels(String s)
    {
        return s.length()==0?0:("aieouAEIOU".indexOf(s.charAt(0))<0?0:1)+countVowels(s.substring(1));
    }
:cool: ;)
 

0x7F800000

Top Contributor
Dieses "Divide and Conquer" ist IMHO überflüssig....
Master-Theorem ? Wikipedia
a=2 b=2 f(n)<O(1)<O(n) => T(n)<O(n)
Hier ist es also auch mit D&C linear...

Außerdem entspricht das nicht JohannisderKaeufer's eigenen vorschlag and Head-Tail zu denken ;)

Und überhaupt: substring ist relativ teuer. Lieber am anfang alles in StringBuilder rüberkopieren und dann immer den ersten buchstaben löschen, dann werden nicht dauernd neue immutable Strings erzeugt, sonst läuft's in O(n²) ;)
 

ModellbahnerTT

Bekanntes Mitglied
Und überhaupt: substring ist relativ teuer. Lieber am anfang alles in StringBuilder rüberkopieren und dann immer den ersten buchstaben löschen, dann werden nicht dauernd neue immutable Strings erzeugt, sonst läuft's in O(n²) ;)
Nur kurz als Ergänzung, bevor jemand den Schwachsinn glaubt: substring() ist natürlich alles andere als "teuer", im Gegensatz zu einem delete in einem StringBuilder! Darum ist die Lösung von oben schon ganz richtig.
 

hdi

Top Contributor
Code:
if("aeiou".contains(x.charAt(i))){...}

Vllt lacht ihr mich jetzt aus, aber das find ich genial. Hätte ich selber wohl auch niemals so geschrieben :oops:
 

0x7F800000

Top Contributor
Nur kurz als Ergänzung, bevor jemand den Schwachsinn glaubt: substring() ist natürlich alles andere als "teuer", im Gegensatz zu einem delete in einem StringBuilder! Darum ist die Lösung von oben schon ganz richtig.

ja ja, hast recht... hab da natürlich blödsinn erzählt :oops:
string builder wird wohl auch nich auf doppelt verketteten listen basieren, sondern auf arrays. Da werden auch n-1 zeichen irgendwoher kopiert: bei substring in einen neuen string, bei builder werden sie um 1 verschoben...
daher braucht man zum entfernen des ersten symbols auch O(n), das ist genauso scheiße wie substring... LinkedList müsste man da eigentlich nehmen... Aber dann ist es einfacher, den string in ruhe zu lassen und den aktuellen index weiterzureichen...

Alles shice. Java ist eben darauf ausgelegt, dort wo es angebracht ist iteration einzusetzen, für solchen rekursiven kram sollte man prolog nehmn :)

@hdi: bwuhaha ;)
 
S

Spacerat

Gast
Nur kurz als Ergänzung, bevor jemand den Schwachsinn glaubt: substring() ist natürlich alles andere als "teuer", im Gegensatz zu einem delete in einem StringBuilder! Darum ist die Lösung von oben schon ganz richtig.
100%ige Zustimmung... Man bekommt zwar eine Referenz (oder Zeiger owai) auf ein neues String-Objekt, dieses beinhaltet aber das Char-Array des vohergehenden Strings, nur mit anderen Start- und End-Pointern. StringBuilder ist in diesem Fall definitiv teurer.
@Edit: Ups... den Text habe ich verfasst, während 0x7F800000 zu seiner Einsicht kam...
 
Zuletzt bearbeitet von einem Moderator:

0x7F800000

Top Contributor
100%ige Zustimmung... Man bekommt zwar eine Referenz (oder Zeiger owai) auf ein neues String-Objekt, dieses beinhaltet aber das Char-Array des vohergehenden Strings, nur mit anderen Start- und End-Pointern. StringBuilder ist in diesem Fall definitiv teurer.
@Edit: Ups... den Text habe ich verfasst, während 0x7F800000 zu seiner Einsicht kam...
So ist das sogar? :eek:
Und was passiert dann mit dem speicher, wenn ich aus einem 10000zeichen-String ein 10zeichen-Substring rausschneide? Bleibt dann das char-array mit allen 10000 zeichen im speicher rumgeistern, weil er vom kleineren string referenziert wird oder wie? Oder kommen da wesentlich kompliziertere speicherverwaltungstaktiken zum einsatz, als ich es mir je gadacht hätte? :autsch:
 
S

Spacerat

Gast
@0x7F800000: Soweit man das überblicken kann sieht's wahrhaftig so aus. Nachlesen kann man es z.B. bei Guido Krüger, im Kapitel Performance-Tuning und man kann sich natürlich die "substring()"-Methoden in der API ansehen.
 

faetzminator

Gesperrter Benutzer
Code:
if("aeiou".contains(x.charAt(i))){...}
Vllt lacht ihr mich jetzt aus, aber das find ich genial. Hätte ich selber wohl auch niemals so geschrieben :oops:
Es ist von der Geschwindigkeit wundervoll, aber ich sag mir immer wider, dass ich nicht wegen der Geschwindigkeit Java programmiere, sondern weil ich (abgesehen davon, dass ich keine multiplen Vererbungen tätigen kann) schön OO programmieren kann.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Passwort Brute Force rekursiv Java Basics - Anfänger-Themen 7
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
R0m1lly Kombinationen aus int array rekursiv Java Basics - Anfänger-Themen 2
L Rekursiv gegebenes Passwort herausfinden. Java Basics - Anfänger-Themen 2
P9cman Char Index rekursiv finden Java Basics - Anfänger-Themen 4
B Methoden Rekursiv festellen, ob eine Zahl gerade-oft vorkommt oder nicht Java Basics - Anfänger-Themen 4
S Methoden Methodenaufruf rekursiv zählen Java Basics - Anfänger-Themen 4
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
sashady Zahlen rekursiv zerlegen und Ziffern addieren Java Basics - Anfänger-Themen 38
jhCDtGVjcZGcfzug Fibonacci Zahlen rekursiv und iterativ Java Basics - Anfänger-Themen 21
H Binominalkoeffizient tail-rekursiv in java darstellen Java Basics - Anfänger-Themen 0
GAZ Tribonacci Folge Rekursiv Java Basics - Anfänger-Themen 11
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
A Ackermmanfunktion rekursiv Java Basics - Anfänger-Themen 4
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
H Rekursiv Methode ausführen bei Kindern Java Basics - Anfänger-Themen 12
G Methode Rekursiv umschreiben Java Basics - Anfänger-Themen 8
L Jede zweite Ziffer entfernen (rekursiv) Java Basics - Anfänger-Themen 6
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
D Pentagonale Nummern in Rekursiv Java Basics - Anfänger-Themen 14
O Enum Array Rekursiv abarbeiten Java Basics - Anfänger-Themen 44
E Weg-Suche-Problem rekursiv Java Basics - Anfänger-Themen 12
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
E Erste Schritte Potenz Negativ (rekursiv) Java Basics - Anfänger-Themen 2
O Rekursiv aufrufen Java Basics - Anfänger-Themen 2
F In List Rekursiv suchen Java Basics - Anfänger-Themen 12
F Iterativ in Rekursiv Java Basics - Anfänger-Themen 2
S Fibonacci Zahlen rekursiv Java Basics - Anfänger-Themen 1
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
B Wie kann ich Linien rekursiv zeichnen? Java Basics - Anfänger-Themen 4
kilopack15 Sin(x) rekursiv lösen Java Basics - Anfänger-Themen 17
T Rekursiv Tiefe eines binären Suchbaums ermitteln Java Basics - Anfänger-Themen 22
P Methoden Arrays.AsList kleinste Zahl ausgeben Rekursiv Java Basics - Anfänger-Themen 9
W A hoch N Rekursiv Java Basics - Anfänger-Themen 3
K Rechtecke rekursiv zeichnen Java Basics - Anfänger-Themen 20
V Quadrate rekursiv zeichnen Java Basics - Anfänger-Themen 7
M Fibonacci rekursiv mittels Cache Java Basics - Anfänger-Themen 17
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
Y Rekursiv Palindrom herausfinden Java Basics - Anfänger-Themen 5
B Fibonacci Zahlen rekursiv Array Java Basics - Anfänger-Themen 12
M String rekursiv Spiegeln mit Originalwort davor Java Basics - Anfänger-Themen 3
K Türme von Hanoi - Rekursiv. Java Basics - Anfänger-Themen 1
T MergeSort rekursiv programmieren Java Basics - Anfänger-Themen 8
M Zahlenpyramide rekursiv programmieren Java Basics - Anfänger-Themen 7
hello_autumn Potenz selber berechnen, Rekursiv. Java Basics - Anfänger-Themen 6
V Text wüerfeln-Rekursiv Java Basics - Anfänger-Themen 4
J Baum rekursiv durchlaufen Java Basics - Anfänger-Themen 2
D Münzverteilung Möglichkeiten | Rekursiv Java Basics - Anfänger-Themen 3
R Hanoi rekursiv lösen Problem Java Basics - Anfänger-Themen 1
D Rekursiv Kombinationen ausgeben klappt nur bei einer Wiederholung Java Basics - Anfänger-Themen 4
shiroX OOP String rekursiv zurückgeben Java Basics - Anfänger-Themen 6
Z Fibonacci rekursiv meine Erklärung stimmt so? Java Basics - Anfänger-Themen 2
S java rekursiv iterativ hilfee :s Java Basics - Anfänger-Themen 5
E Erste Schritte Pi, rekursiv Java Basics - Anfänger-Themen 6
A Frage Methode ggt Rekursiv Java Basics - Anfänger-Themen 5
E Hanoi-Varianten rekursiv Java Basics - Anfänger-Themen 2
P Hanoi rekursiv zu iterativ umbauen Java Basics - Anfänger-Themen 20
P Mittelwert rekursiv Java Basics - Anfänger-Themen 13
E Integral Rekursiv Java Basics - Anfänger-Themen 15
M MergeSort rekursiv Java Basics - Anfänger-Themen 2
D Ziffer in Zahl Rekursiv Java Basics - Anfänger-Themen 4
B Array rekursiv untersuchen Java Basics - Anfänger-Themen 21
I Rekursiv Java Basics - Anfänger-Themen 13
C Rekursiv Zahlenfolgen berechnen mit zwei Variablen Java Basics - Anfänger-Themen 5
K Rekursiv zu Literal Java Basics - Anfänger-Themen 12
R Verzeichnisse rekursiv nach Dateiduplikaten durchsuchen Java Basics - Anfänger-Themen 5
L File Tree rekursiv Java Basics - Anfänger-Themen 10
W Binomialkoeffizient iterativ/rekursiv Java Basics - Anfänger-Themen 2
X Addition rekursiv ohne Schleife Java Basics - Anfänger-Themen 10
M Sudoku Rekursiv lösen Java Basics - Anfänger-Themen 9
E Datentypen ein java problem rekursiv loesen Java Basics - Anfänger-Themen 2
K indexOf selbst rekursiv definieren Java Basics - Anfänger-Themen 4
M Fibonacci-Linear und Rekursiv Java Basics - Anfänger-Themen 14
J Java Rekursiv vs(zu) Iterativ Hilfe Java Basics - Anfänger-Themen 3
D preOrder, inOrder, postOrder rekursiv zusammensetzen aus String Java Basics - Anfänger-Themen 1
K Binomialkoeffizient rekursiv berechnen Java Basics - Anfänger-Themen 8
J eulersche rekursiv berechnen Java Basics - Anfänger-Themen 6
J Suchbaumeigenschaft rekursiv programmieren Java Basics - Anfänger-Themen 3
G Bestimmte Ebene eines Baumes rekursiv ausgeben Java Basics - Anfänger-Themen 49
F Sortieralgorithmus von rekursiv auf iterativ? Java Basics - Anfänger-Themen 21
G Sudoku rekursiv lösen Java Basics - Anfänger-Themen 10
S Stringlänge Rekursiv ermitteln Java Basics - Anfänger-Themen 2
dognose Verzeichnis rekursiv auslesen / beschränkte Apis. Java Basics - Anfänger-Themen 6
0 a hoch b rekursiv - wie stoppen? Java Basics - Anfänger-Themen 3
T Ordnerstrucktur rekursiv auslesen Java Basics - Anfänger-Themen 9
G Rekursiv die größte Zahl eines Arrays Java Basics - Anfänger-Themen 6
G Rekursiv Array Elemente quadrieren Java Basics - Anfänger-Themen 2
N Fibo Zahlen:iterativ,rekursiv Anzahl der Additionen zählen Java Basics - Anfänger-Themen 2
P Permutationen einer Tour rekursiv Java Basics - Anfänger-Themen 4
G Baumstruktur rekursiv durchlaufen Java Basics - Anfänger-Themen 2
B Kürzesten Weg zwischen mehreren Punkten finden (rekursiv) Java Basics - Anfänger-Themen 5
L Kombinationen einer Menge rekursiv berechnen Java Basics - Anfänger-Themen 11
J BinBaum rekursiv ausgeben Java Basics - Anfänger-Themen 9
W Rekursiv Zeichen einfügen Java Basics - Anfänger-Themen 6
M Verzeichnisse rekursiv durchlaufen und dann RegEx Java Basics - Anfänger-Themen 6
G Array rekursiv teilen und aufsummieren Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben