Rekursion mit Abbruch nach n durchläufen



  • Hallo, ich soll einen code schreiben,d er die rekursive Berechnung der Fibonaccizahlen nach 1000 Durchläufen abbricht.
    Alelrdings komme ich mit der Abbruchbedingung nicht klar...

    Ich nicht, wie ich "stop" erhöhen soll, da fib 2 mal aufgerufen wird..
    Mein code ist hier:

    #include <stdio.h>
    
    int fib (int n, int stop) {
    int k = 1;
    
    if(stop==1000){
        k = 0;
        return k;
    }
    
    if(n == 0){
        return 0;
    }else if(n == 1){
        return 1;
    }
    
    if(k=1){
        return fib (n-1, stop++) + fib (n-2, stop++);  
    }
    }
    
    int main(void){
    int erg, n = 0, stop = 0;
    printf("Bitte Wert eingeben: ");
    scanf("%d", &n);
    
    erg = fib(n, stop);
    printf("Fibonaccizahl: %d", erg);
    
    return 0;
    }
    

    Für Hilfe bin ich dankbar. 🙂



  • natürlich muss da if(k==1) stehen.



  • Es hat sich geklärt, ich bin durch pointer auf eine Lösung gekommen! 🙂

    #include <stdio.h>
    
    int fib (int n, int *stop) {
    int k = 1;
    (*stop)++;
    printf("Zahl: %d\n", *stop);
    
    if((*stop)>=1000){
        k = 0;
        printf("Abbruch--------");
        return k;
    }
    
    if(k==1){
        if(n == 0){
        return 0;
    }else if(n == 1){
        return 1;
    }
    
    return fib (n-1, (stop)) + fib (n-2, (stop));
    }
    }
    
    int main(void){
    int erg, n = 0, stop = 0;
    
    int *k;
    *k = 0;
    
    printf("Bitte Wert eingeben: ");
    scanf("%d", &n);
    
    erg = fib(n, k);
    printf("Fibonaccizahl: %d", erg);
    
    return 0;
    }
    

  • Mod

    Wozu ist k überhaupt da? Warum erhöhst du stop nicht nur ein Mal? Es zwingt dich doch niemand, es zweimal zu tun¹. Bist du überhaupt sicher, dass das nicht trotzdem so gemeint ist, wie du es derzeit hast? Es geht ja wohl darum, die exorbitant hohe Zahl der Funktionsaufrufe zu begrenzen, die nötig ist, wenn man die Reihe so ineffizient implementiert, wie du es hier getan hast. Insofern wäre es ja durchaus sinnvoll, auch wirklich bei jedem Funktionsaufruf den Zähler zu erhöhen.

    ¹: Außerdem ist unklar, welche Funktion am Ende welchen Wert bekommt, wenn du das so aufschreibst wie jetzt.


  • Mod

    Meine vorherige Antwort bezog sich auf deine Beiträge 1 und 2. Dein neues Programm ist total falsch und kann nicht funktionieren.



  • Ich habe den Algorithmus nicht überprüft,
    aber was sagt denn der Compiler zu Zeile 29?

    Dazu zählen auch Warnungen! (Wenn er nichts sagt, stell den Warnlevel höher).



  • // too late.



  • Was genau soll denn das Problem an meiner zweiten Variante sein?
    Wenn ich es laufen lasse und eine zu hohe Anzahl Durchläufe entsteht, bricht es ab. Und das soll es doch auch?



  • ANO schrieb:

    Was genau soll denn das Problem an meiner zweiten Variante sein?
    Wenn ich es laufen lasse und eine zu hohe Anzahl Durchläufe entsteht, bricht es ab. Und das soll es doch auch?

    Und was sagt Dein Compiler, wenn Du die Warnstufe hochdrehst?



  • ANO schrieb:

    Was genau soll denn das Problem an meiner zweiten Variante sein?

    Was machst du in Zeile 28 und 29?

    ANO schrieb:

    Wenn ich es laufen lasse und eine zu hohe Anzahl Durchläufe entsteht, bricht es ab. Und das soll es doch auch?

    Darum geht es nicht.
    Nur weil ein C-Programm funktioniert, ist es noch lange nicht richtig.



  • In Zeile 28 und 29 setze ich den Wert der Variablen, auf die *k zeigt auf 0.
    Was soll daran denn falsch sein? 😕



  • ANO schrieb:

    In Zeile 28 und 29 setze ich den Wert der Variablen, auf die *k zeigt

    Welche ist das denn genau?



  • Wenn du meinst, wieso ich das mache..
    Damit dem k am Anfang der Wert 0 zugewiesen wird und nicht irgendein beliebiger.
    Und ich den Zähler in der Funktion bei 0 starten lasse.



  • ANO schrieb:

    In Zeile 28 und 29 setze ich den Wert der Variablen, auf die *k zeigt auf 0.
    Was soll daran denn falsch sein? 😕

    Auf welche Variable zeigt k?



  • Wo du es sagst... eigentlich auf keine.
    Das müsste man dann wohl noch ändern.



  • ANO schrieb:

    Wo du es sagst... eigentlich auf keine.

    Das ist ein böser Fehler!

    ANO schrieb:

    Das müsste man dann wohl noch ändern.

    Unbedingt.
    Eigentlich sollte der Compiler da eine Warnung aussprechen (wenn die Einstellungen es erlauben)

    Aber du brauchst da keinen Zeiger.
    Mach einfach eine Variable daraus und übergib die Adresse an die Funktion.



  • Okay, vielen lieben Dank. 🙂


Anmelden zum Antworten