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++.