Die maximale Rekursionstiefe?



  • Hi,
    Ich habe ein Ackermann-Funktion Programm gechreiben.

    int ackermann( int n, int m ) { 
      if( n==0 ) return m+1; 
      else if( m == 0 ) return ackermann( n-1, 1 ); 
      else return ackermann( n-1, ackermann( } 
    
      int main( int argc, char **argv ) { 
       int n, m, a; n = 2; m = 11; 
       a = ackermann( n, m ); 
       printf( "ackermann(%d,%d) = %d\n", return 0; }
    

    Nun muss das program auch die maximale Rekursionstiefe und die Gesamtanzahl von Aufrufen der Funktion im Hauptprogramm ausgeben. Wie mache ich dass?? Ich habe im google "Rekursiontiefe c++" geschrieben aber bekomme nicht viel.

    danke



  • /Edit

    Ok ich gebs auf da findet man ja immer mehr Fehler im Code, korrigiere das erst einmal.



  • sorry 😞

    #include <iostream>
    using namespace std;
    
    int ackermann( int n, int m )
    {
     if( n==0 ) return m+1;
       else if( m == 0 ) return ackermann( n-1, 1 );
       else return ackermann( n-1,ackermann( n, m-1 ));
    }
    int main( )
    {
    int n, m, a;
    n = 2; m = 11;
     a = ackermann( n, m ); 
     printf( "ackermann(%d,%d) = %d\n", n, m, a ); return 0;}
    


  • also anzahl von aufrufen und maximale rekursionstiefe is doch gleich, oder? naja, anzahl aufrufe einer funktion geht mit static variablen, die bleiben auch nach beenden einer funktion erhalten.

    int funk(){
       static anz=0;
       return ++anz;
    }
    

    die funktion gibt zurück, wie oft sie aufgerufen wurde..



  • int funk(){
       static anz=0;
       return ++anz;
    }
    

    würde die anzahl der gesamten aufrufe zurückgeben. jedoch nicht die max. rekursionstiefe!

    das sollte eher so funktionieren :

    int funk()
    {
        static int max_lvl=0;
        static int lvl=0;
    
        lvl++;
        if (lvl > max_lvl) max_lvl = lvl;
        ...
        funk();
        ...
        lvl--;
        return max_lvl;
    }
    


  • Ok damit kann man was anfangen 🙂

    #include <iostream>
    using namespace std;
    
    int ackermann( int n, int m, int &i )
    {
     ++i;
     if( n==0 ) return m+1;
       else if( m == 0 ) return ackermann( n-1, 1, i );
       else return ackermann( n-1,ackermann( n, m-1, i ));
    }
    int main( )
    {
    int n, m, a, i;
    n = 2; m = 11, i=0;
     a = ackermann( n, m, i );
     printf( "ackermann(%d,%d) = %d\nAnzahl der Aufrufe: %d", n, m, a, i ); return 0;}
    

    Die maximale Anzahl an Aufrufen (also die maximale Rekursionstiefe) hängt von der größe des Stacks ab, wenn der voll ist kann man keine weitere Funktion (fehlerfrei) aufrufen.

    Es gibt sicher eine API-Funktion in deinem Betriebsystem mit welchem du den freien Speicher ermitteln kannst, anschließend berechnest du die größe des verbrauchten Speicher für jeden Funktionsaufruf (auf dem Stack) und schon hast du die maximal mögliche Anzahl an aufrufen.


Anmelden zum Antworten