Fibonacci - Problem



  • Hallo,

    ich hab folgendes Problem.
    Ich möchte gerne die internen Funktionsaufrufe zählen die ich für die rekursive Fibonaccifolge programmiert habe.

    Hier mein Prog:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int zaehl=0;
    int fibo(int x);
    
    void main(void)
    {
    	long int Fibo,n;
    	double start,end;
    
    	printf("rekursive Fibonacciberechnung\n");
    	printf("Geben Sie einen beliebigen POSITIVEN Wert ein: "); scanf("%d",&n);
    
    	start=clock();
    
    	if(n==0 || n<0 || n>46){
    		printf("F(n)= 0\n");
    		exit(1);}
    	else if(n==1){
    			printf("F(n)= 1\n");
    			exit(1);}
    
    	Fibo=fibo(n);
    
    	end=clock();
    
    	printf("\nF(n)= %d\n",Fibo);				// Ausgabe
    	printf("\nFunktionsaufrufe: %d\n",zaehl);	// Ausgabe des Zählers/Funktionsaufrufe
    	printf("\nDauer: %.2f Sekunden\n",(float)(end-start) / CLOCKS_PER_SEC);
    
    }
    
    int fibo(int x)
    {
       zaehl++;  // Soll die Funktionsaufrufe zählen!
    	if(x==0)
          return 0;
       else if(x==1)
          return 1;
       else
          return fibo(x-1)+fibo(x-2);
    
    }
    

    Frage: ist das so korrekt, dass ich einfach bei Aufruf der Funktion den "Counter" hochzählen lasse?

    thx for reading 🙂



  • Globale Variablen sind nicht so der Hammer - andere würden sagen verhasst 🙂

    Aber die Anzahl der Funktionsaufrufe kannst du auch einfach berechnen in dem du die Variable zwar lokal aber mit "static" deklarierst. static sorgt dafür, dass die Variable auch nach dem Funktionsende ihren Wert behält:

    int fib (int x)
    {
        static int counter = 0;
        ++counter;
    
        // do something
    }
    

    MfG SideWinder



  • main Funktion muss außerdem int main sein!



  • supertux schrieb:

    main Funktion muss außerdem int main sein!

    Ganz wichtig, sonst funktioniert Rekursion nicht.

    MfG SideWinder



  • warum muss das int main sein?

    die funktion ist vom Typ int, aber das Main Progamm kann auch void sein. Ich meine, es funktioniert, nur der Counter halt nicht.

    bye



  • SideWinder schrieb:

    Globale Variablen sind nicht so der Hammer - andere würden sagen verhasst 🙂

    Wieso andere, du etwa nicht? 😃



  • Krugman schrieb:

    warum muss das int main sein?

    die funktion ist vom Typ int, aber das Main Progamm kann auch void sein. Ich meine, es funktioniert, nur der Counter halt nicht.

    bye

    Nein, laut ANSI C Standard gibt es nur 3 gültige Definitionen für main

    int main(void); /* bzw nur int main() */
    int main(int argc, char** argv);
    int main(int argc, char* argv[]);
    

    Programme liefern der shell einer 0 zurück, wenn das Programm keine Fehler hat, eine Zahl ungleich 0 sonst. Eine void main ist 1. falsch, 2. häßlich, 3. länger als int main, 4. nicht Standard-konform, 5. kann der Shell keine Werte zurückliefern.



  • supertux schrieb:

    Nein, laut ANSI C Standard gibt es nur 3 gültige Definitionen für main[...]

    ANSI-C Standard von 1999 schrieb:

    5.1.2.2.1 Program startup
    1 The function called at program startup is named main. The implementation declares no
    prototype for this function. It shall be defined with a return type of int and with no
    parameters:

    int main(void) { /* ... */ }
    

    or with two parameters (referred to here as argc and argv, though any names may be
    used, as they are local to the function in which they are declared):

    int main(int argc, char *argv[]) { /* ... */ }
    

    or equivalent;9) or in some other implementation-defined manner.

    9) Thus, int can be replaced by a typedef name defined as int, or the type of argv can be written as
    char ** argv, and so on.

    Auch hier nachzulesen



  • Damit hast du sein Weltbild zerstört!! 😉

    PS:Nichts für ungut Pablo 😃 😉

    MfG Spacelord



  • Spacelord schrieb:

    Damit hast du sein Weltbild zerstört!! 😉

    PS:Nichts für ungut Pablo 😃 😉

    MfG Spacelord

    hat er nicht, wenn sie es falsch machen wollen, ist ihr Sache, nicht mein Problem. Hoffe, ihre Programme müssen nie in einem bash-skript benutzt werden, das könnte böse ändern.



  • Ich habe nie gesagt, dass ich was anderes als int main befürworte oder benutze. Ich habe dich nur auf eine offensichtlich falsche Aussage hingewiesen. Wenn du dich schon auf den Standard berufen willst, dann solltest du es auch vollständig tun.

    EDIT1: Vorher stand hier das Gegenteil. Habe im Eifer des Gefechts 2 Worte vergessen.
    EDIT2: Plöder Rechtschreibfehler in EDIT1:



  • nach der ISO Standart ist der Kopf so aifgebaut:

    int main(void)
    {
    ...
    }

    aber das tut doch jetzt nix zur Sache. ich wollte nur das ihr bei meinem Problem helf. is das den sho schwer :>

    PS: ob int oder void, bei dem kleinen programm ist das unfug.

    cya
    🤡



  • Krugman schrieb:

    PS: ob int oder void, bei dem kleinen programm ist das unfug.

    Wenn du Projekte sauber realisieren willst, dann solltest du dich von dieser Denkweise verabschieden. Es macht keinen Unterschied, ob dein Programm klein oder gross ist. Es gibt einfach Richtlinien, an die man sich halten muss. Und der Standard ist einer dieser Leitfäden.

    Krugman schrieb:

    aber das tut doch jetzt nix zur Sache. ich wollte nur das ihr bei meinem Problem helf.

    Wo gibts denn noch Probleme? So wie du es machen willst, ist schon ok. SideWinder's Tipp mit dem lokalen static ist zwar nett, für dich aber unbrauchbar, da du den Zähler an anderer Stelle noch ausgeben willst.



  • Krugman schrieb:

    nach der ISO stan**** ist der Kopf so aifgebaut:

    int main(void)
    {
    ...
    }

    Danke, aber das hätte das geschulte Auge auch sicher in meinem geposteten Standard-Auszug erkennen können.

    Krugman schrieb:

    PS: ob int oder void, bei dem kleinen programm ist das unfug.

    Es ist Unfug da drüber zu streiten. void main ist einfach Mist!



  • ich kapiere nicht warum das mist sein soll. kann mir das einer plausibel erklären, das ich als einsteiger auch ein bissle was davon verstehe.



  • Weils nicht standardkonform ist. Basta!



  • Krugman schrieb:

    ich kapiere nicht warum das mist sein soll. kann mir das einer plausibel erklären, das ich als einsteiger auch ein bissle was davon verstehe.

    void main hat zu viele Nachteile und keine Vorteile (ausser, dass man sich als Anfänger nicht fragen muss, wofür der Rückgabewert überhaupt da ist). Ausserdem sollte man sich - wenn man im jeweiligen Fall die Freiheit hat - immer für die Möglichkeiten entscheiden, die der Standard vorgibt.


Anmelden zum Antworten