Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Rekursionstiefe ausgeben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
27.11.2002, 18:54 Uhr
karim



hallo...

ich hätte da mal ne frage, deren antwort mich echt brennend interessiert.

ich kann ich die rekursionstiefe einer funktion im hauptprogramm ausgeben?

ich hab da mal einen ansatz. ich könnte ja eine globale variable t bestimmen.
und dann in der funktion zählen lassen.. hier mal ein beispiel:

int bsp(int a, int b) {
if (a == 0)
::t = 1;
return b;

else
::t = 2;
return a;
}

geht das so? ich hab nämlich ein beispiel so programmiert aber er gibt mir immer nur 1 aus obwohl es eigentlich 2 sein müsste... kann mir da jemand bitte sagen was ich falsch gemacht habe?

ausserdem würd ich gern wissen wie ich die Anzahl der Aufrufe der Funktion im Hauptprogramm ausgeben kann. die ausgabe selbst ist ja kein problem aber wie was gezählt wird schon eher..

danke.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.11.2002, 08:04 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Warum es nur 1 ausgibt? naja deine Funktion ruft sich ja nicht rekursiv auf ...
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.11.2002, 10:05 Uhr
void*
Generic Pointer
(Operator)


Hallo!

Schwebt Dir soetwas vor:


C++:
#include <stdio.h>

void f(int i)
{
  static tiefe=0;

  printf("%d\n", ++tiefe);

  if(i)
  {
    f(i/2);
  }  
  printf("%d\n", --tiefe);
}

int main(void)
{
  int i;

  scanf("%d", &i);

  f(i);

  return(0);
}


--
Gruß
void*
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.11.2002, 13:54 Uhr
virtual
Sexiest Bit alive
(Operator)


Hi,

wer C++ mag, macht da eine kleine Klasse zu. Meine erste Überlegung dazu ist
ein kleines Template (was haltet ihr davon?):

C++:
// RecursionWatcher.h
template<void* T>
class RecursionWatcher
{
    static int m_nDepth;

public:
    RecursionWatcher() { ++m_nDepth; };
    ~RecursionWatcher() { --m_nDepth; };

    bool checkDepth(int p_nMaxDepth) const { return p_nMaxDepth<m_nDepth; };
    int getDepth() const { return m_nDepth; };
};

template<void* T>
int RecursionWatcher<T>::m_nDepth = 0;


Einsetzen kann man das zB so:

C++:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include "RecursionWatcher.h"

using namespace std;

int sum(int i)
{
    RecursionWatcher<(void*)sum> watcher;
    if (watcher.checkDepth(10) || i<0) return 0;
    return i + sum(i-1);
}


int main()
{  
    srand(time(NULL));
    
    int n = rand()%2000;
    cout << "Summe von " << n-9 << " bis " << n << ": " << sum(n) << endl;
    
}


Im Prinzip ist die Klasse nix anderes als ein static int, welches durch die Konstruktion von watcher in sum automatisch hochgezählt wird und durch die destruktion beim verlassen der Funktion runtergezählt wird. Mit checkDepth kann man gegen die grenze der max. gewünschten Rekursionstiefe checken...

Template muss das ganze sein, weil so ein Watcher ja in mehreren Funktionen verwendet werden soll. Daher übergibt man als Templateparameter einfach die Addresse der Funktion, wodurch das Template immer passend zur Funktion instanziiert wird.

Den Vorteil, den diese Methode bietet, sehe ich darin, dass bei komplexeren Funktionen sich ansonsten schnell mal der Fehler einschleicht, daß man vergisst, der RecursionCounter zu dekrementieren. Und auch bei einfachen Funktionen sollte das Template eigentlich keinen (nennenswerten) Overhead nach sich ziehen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 28.11.2002 um 13:57 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: