Rekursion + Zeichenketten



  • ;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 😉


Anmelden zum Antworten