Rekursion + Zeichenketten
-
scheint so als kursiert hier zur zeit die recursions grippe
das wird durch die recursion weder schöner noch schneller also was willst damit?
lg lolo
-
wie ich schon im ausgangspost schrieb muss ich das so machen so ist halt die aufgabenstellung
iterativ hab ichs ja schon gelöst aber die aufgabenstellung sieht vor, dass ich das auch noch rekursiv darstellen soll und da haperts bei mir eben gerade ob das dadurch schneller schöner oder die welt retten kann ist dem aufgabensteller egal
-
char *findLast(char *s,char c){ char *b; if(*s){ b = findLast(++s,c); if(b) return b; else if(*s == c) return s; else return 0; } return 0; }
das ist mir schwer gefallen
lg lolo
-
naja wie gesagt muss die funktion vom typ int sein und nicht char also ist das noch nicht die endgültige lösung aber danke schonmal soweit
wie gesagt die struktur der funktion muss dieser hier : int position_it(char* str,char z) entsprechen
-
ja keine ahnung wieso du da ein int wieder raus haben willst, ich würd das ganz schamlos in eine andere function kapseln und dann die pointer verrechnen, auch hat sich ein kleiner fehler in der function eingeschlichen, "++s"
char *findLast(char *s,char c){ char *b; return *s ? (b = findLast(s+1,c)) ? b : (*s == c) ? s : 0 : 0; } int position_it(char* str,char z){ char *ret = findLast(str,z); if(ret) return ret-str; return -1; }
hoffe das ist ein bischen besser
lg lolo
-
seb123 schrieb:
naja wie gesagt muss die funktion vom typ int sein und nicht char also ist das noch nicht die endgültige lösung aber danke schonmal soweit
wie gesagt die struktur der funktion muss dieser hier : int position_it(char* str,char z) entsprechen
So in etwa:
int strpos (char* s, char z) { static int pos, tmp ; if (*s++ == z) pos = tmp; tmp++; if (*s) return strpos(s++, z); else return pos; }
-
Wilma schrieb:
int strpos (char* s, char z) { static int pos, tmp ; if (*s++ == z) pos = tmp; tmp++; if (*s) return strpos(s++, z); else return pos; }
^^ geht nur einmal wegen der static variablen, hihi.
so vielleicht (noobLolos funktion leicht umgebaut):int findLast(char *s,char c) { if (*s) { int b = findLast (s+1, c); if (b) return b+1; if(*s == c) return 1; } return 0; }
-
;fricky schrieb:
so vielleicht (noobLolos funktion leicht umgebaut):
int findLast(char *s,char c) { if (*s) { int b = findLast (s+1, c); if (b) return b+1; if(*s == c) return 1; } return 0; }
gibt bei mir leider immer nur die 0 zurück und nicht die korrekte position an der das zeichen zum letzten mal vorkommt
nebenbei läuft er die zeichenkette von hinten durch kann dann die positionsangabe falls sie funktionieren würde korrekt sein ?
-
seb123 schrieb:
gibt bei mir leider immer nur die 0 zurück und nicht die korrekte position an der das zeichen zum letzten mal vorkommt
geht bei mir seltsamerweise. wie hastes denn aufgerufen?
seb123 schrieb:
nebenbei läuft er die zeichenkette von hinten durch kann dann die positionsangabe falls sie funktionieren würde korrekt sein ?
er schmeisst ja zuerst alles auf den return-stack, dann fängt er an zu zählen. er beginnt mit dem zählen beim ersten zeichen (von hinten), das dem suchzeichen entspricht (alle davor ergeben 0, siehe die 'if's, deswegen werden die nicht mitgezählt) und zählt ab da immer +1 weiter, bis der stack leer ist. wenn du z.b. 10 dinge vor dir aufreihst, ist es egal, ob du von links nach rechts oder umgekehrt zählst, du kommst immer auf 10.
-
die funktion sieht im moment so aus
int findLast(char *s,char z) { if (*s) { int b = findLast (s+1, z); if (b) return b+1; if(*s == z) return 1; } return 0; }
der Funktionsaufruf lautet
printf("\n Rueckgabewert : %d \n" , findLast(str1,z));
wobei str1 eben ein vorher festgelegtes array ist das durchsucht werden soll
-
mach's so:
int findLast(char *s,char z) { if (*s) { int b = findLast (s+1, z); if (b) return b+1; if(*s == z) return 1; } return 0; } int main (void) { char *s = "z...z...z..."; char z = 'z'; printf ("%d\n", findLast (s, z)); // <-- gibt 9 aus }
-
hey funktioniert soweit aber er scheint immer eine Position zu hoch auszugeben
z.B. bei "zwanzig" müsste 4 rauskommen er aber gibt 5 aus.
-
int findLast(char *s,char z) { if (*s) { int b = findLast (s+1, z); if (b>-1) return b+1; if(*s == z) return 0; } return -1; }
habs nicht getestet
lg lolo
-
seb123 schrieb:
hey funktioniert soweit aber er scheint immer eine Position zu hoch auszugeben
z.B. bei "zwanzig" müsste 4 rauskommen er aber gibt 5 aus.ja, er fängt bei 1 an zu zählen. wenn du den string-offset brauchst, kannste ja zum schluss einen abziehen: printf ("%d\n", findLast (s, z)-1);
-
hey nochma ne kurze frage
wenn kein z vorkommt soll -1 zurückgegeben werden
im moment behelf ich mich so, dass ich manuell das erste zeichen der zeichenkette übergebe mit der bedingung, dass b null sein muss wie bekomm ich aber das erste zeichen der zeichenkette bei einer rekursiven funktion dort sodass das programm allgemeingültig ist ?
int position_rek(char* str,char z) { if (*str) { int b = position_rek (str+1, z); if (*str == 'D' && b == 0) return -1; if (b) return b+1; if(*str == z) return 1; } return 0; }
danke
-
noobLolo schrieb:
int findLast(char *s,char z) { if (*s) { int b = findLast (s+1, z); if (b>-1) return b+1; if(*s == z) return 0; } return -1; }
habs nicht getestet
lg lolo
kanns gerade nicht durch den compiler jagen, sollt doch schon so sein oder?
-
hatte das von fricky genommen
aber danke hab einfach die 2 kleinen sachen geändert und nun gehts problemlos