Rekursionsaufgabe



  • Huhu, angemeldet geht besser...

    Bis jetzt habe leider keinen Ansatz gefunden, da ich absolut Anfänger bin...
    Habe auch nur einfachere Aufgaben gemacht, in denen es eine Folge von Zahlen gab und ich was rechnen sollte und so was.

    Es verwirrt mich, dass ich die Zahl ja irgendwie zerlegen muss, also z. Bsp. /1000.
    Was aber wenn die Zahl 5 Stellen hat, dann geht das schon nicht mehr...

    Hab also noch keinen Ansatz... Sorry...



  • Tipp: Modulo-Operator



  • Und dann?
    modulo was???



  • Da kann man beqeuem mit dem Teilungsrest arbeiten:

    // in einem Durchlauf/Aufruf mit zahl als Eingabe:
    ziffer = zahl % 10;
    naechste_zahl = zahl / 10;
    

    zahl % 10 ergibt eine Zahl, die der Einerstelle entspricht. zahl / 10 ergibt ein Zehntel von Zahl, mit der üblichen Abschnittsrundung ergibt das genau die Zahl ohne die Einerstelle.

    Das kannst du dann rekursiv oder in einer Schleife immer wieder machen, bis zahl / 10 gleich Null ist.



  • Hmmm...

    Dann wäre der einfachste Fall, also der Rekursionsabbruch:

    1 falls ziffer=zahl

    und ansonsten soll er:

    ziffernsuche(zahl mod 10,ziffer)

    machen...

    und wann gibt er dann die 0 aus??? Wenn zahl= 0 ist???

    Oh Gott, bis jetzt hab ich alles verstanden, aber diese Aufgabe ist für mich grad echt der Hammer!!! Grrrr...



  • ann wäre der einfachste Fall, also der Rekursionsabbruch:

    1 falls ziffer=zahl

    Ich denke, du hast es verstanden. Du mußt aber auch abbrechen, wenn keine Ziffern mehr da sind, und kein Suchtreffer darunter war. Also zwei Abbruchbedingungen, eine für den Fall, das was gefunden wurde, und eine für den Fall, das man am Ende ankommt, und nichts gefunden hat.

    ziffer hab ich oben für einen Zwischenwert verwendet, ich nenn's mal such_ziffer.

    funktion ziffernsuche(zahl, such_ziffer)
        falls such_ziffer == zahl % 10   // Ende der Suche -- Treffer
            return wahr
        andernfalls zahl == 0            // Ende der Suche -- nichts gefunden
            return falsch
        andernfalls
            return ziffernsuche(zahl / 10, such_ziffer)
    


  • Juhu!!!!!!!!!!



  • Ich hab's getestet, und noch einen Fehler gefunden:
    man muß zuerst prüfen, ob zahl Null ist, sonst bekommt man Probleme wenn such_ziffer Null ist.
    Bevor ich also den falschen Pseudocode so stehen lasse:

    #include <stdio.h>
    
    #define PRINTD(x) (printf("%s -> %d\n", #x, x))
    
    int ziffernsuche(int zahl, int such_ziffer)
    {
        if (zahl == 0)
            return 0;
        else if (such_ziffer == zahl % 10)
            return 1;
        else
            return ziffernsuche(zahl / 10, such_ziffer);
    }
    
    int main(void)
    {
        PRINTD(ziffernsuche(12345, 0));
        PRINTD(ziffernsuche(12345, 2));
        PRINTD(ziffernsuche(12345, 7));
        return 0;
    }
    

    So, jetzt hab ich deine Hausaufgabe gemacht.
    Wenn wir uns jemals begegnen zahlst du mir ein Bier, oder? 🙂



  • @bgdnoy: das ist trotzdem einen winzig kleinen Fehler:

    PRINTD(ziffernsuche(0, 0)); würde ziffernsuche(0, 0) -> 0 ausgeben und es sollte 1 sein, da 0 bei 0 vorkommt 😉



  • Eine andere Möglichkeit ist, die Zahl als String zu verpacken und dann zu warten, bis in der Rekursion '\0' erreicht ist.

    #include <stdio.h>
    #include <string.h>
    
    int main(){
    
    char n[20];
    sprintf(n, "%s", "0");
    
    printf("%i\n", ziffernsuche(n, 0)); 
    
    return 0;
    }
    
    int ziffernsuche(char *n, int d) {
    	if (strlen(n))
    		if ( *n == ('0' + d) )
    			return 1;
    		else
    			return ziffernsuche(n+1, d);
    	else
    		return 0;
    }
    


  • curry-king, das ist die TheDailyWTF-Version 😉



  • @bgdnoy: Aber klar doch!

    Bin aber auch so schon drauf gekommen, wie die Lösung aussieht... 😃

    Danke für die Hilfe!!!


Anmelden zum Antworten