Lokale static Variable bei Rekursion



  • Wenn ich in einer rekursiven Funktion eine static Variable habe:

    int mySort(int* zahlen, size_t groesse){
     static int swapHelper = 0;
     // ... usw.
    }
    

    ... bekommt dann jede Rekursions-Ebene der Funktion ihr 'eigenes' Exemplar dieser static-Variablen (und wird die auch jedesmal mit 0 initialisiert?), oder
    existiert dieser swapHelper nur ein einziges Mal zugleich (für alle Rekursionsebenen derselben Funktion)?



  • Letzteres.



  • existiert dieser swapHelper nur ein einziges Mal zugleich (für alle Rekursionsebenen derselben Funktion)?

    Ja, das ist ja der Sinn von static (in diesem Kontext).



  • Das ist nicht nur für alle Rekursionsebenen das selbe Exemplar, sondern auch für alle sonstigen Aufrufe der Funktion - selbst die, die in verschiedenen Threads geschehen.

    Deswegen lässt man so was auch sein. Wenn du einen gemeinsamen Speicher für alle Rekursionsebenen brauchst, geht das beispielsweise so:

    int do_recurse(int param, int &storage) {
      if(param == 0) {
        return storage;
      }
    
      ++storage;
      return do_recurse(param / 2, storage);
    }
    
    int recurse(int param) {
      int x = 0;
      return do_recurse(param, x);
    }
    

    Eine andere Möglichkeit wäre, die Rekursion in einer Memberfunktion zu machen und das Objekt als Status zu benutzen:

    class recursor {
    public:
      recursor();
      int recurse();
    
    private:
      int storage_;
    };
    
    recursor::recursor() : storage_(0) { }
    int recursor::recurse(int param) {
      if(param == 0) {
        return storage_;
      }
    
      ++storage_;
      return recurse(param / 2);
    }
    
    // ...
    
    int x = recursor().recurse(200);
    


  • Tschuldigung, ich hab mich im Forum verkuckt. Die Klassengeschichte kannst du getrost vergessen, der erste Vorschlag sieht dann so aus:

    int do_recurse(int param, int *storage) {
      if(param == 0) {
        return *storage;
      }
    
      ++*storage;
      return do_recurse(param / 2, storage);
    }
    
    int recurse(int param) {
      int x = 0;
      return do_recurse(param, &x);
    }
    

    Der Kram oben geht nur in C++.


Anmelden zum Antworten