Rekursion abbrechen und hinter dem Aufruf im main weiter?



  • hat jemand eine idee wie ich aus einer rekursiven funktion, am besten aussteigen kann ohne dass ich wieder ganz zurückspringen muss? das problem mit exit(); ist dass da das ganze programm terminiert ich will aber im main() nach dem funktionsaufruf weitermachen!

    thx



  • hm. du könntest ne exception werfen:

    void rekursiveFkt()
    {
    ...
      if ( spezielleBedingung )
         throw exception;
    ...
    }
    
    int main()
    {
    ...
    try
    {
      rekursiveFkt();
    }
    catch ( exception& )
    {
    
    }
    ...
    }
    

    alternativ (aber wohl nicht besser) gehts auch mit setjmp/longjmp.



  • Also da ist natürlich die Frage erlaubt, ob goto nicht besser wäre. Exceptions sind doch mindestens genauso verpöhnt zur Steuerung, oder sehe ich das falsch?



  • goto geht in C++ aber nur innerhalb einer Funktion. (CMIIW, ich hab's nie benutzt.)

    Das Beispiel ist jetzt nicht gerade konkret, aber manchmal kriegt man das auch ganz gut ohne Exceptions hin - indem die Funktion einen bool zurückgibt, ob weiteres rekursieren nötig ist o.Ä.



  • naja setjmp/longjmp is ja ein globales-super-goto
    mit dem man ueber die funktionsgrenzen hinweg springen kann.



  • Oh...na denn. setjmp/longjmp kannte ich bisher auch nur aus Erzählungen. Jetzt wüsste ich sogar, warum man das anwendet. 🙂



  • Auch beim aufruf einer rekursiven funktion wird ein stackframe für die funktion aufgebaut den es gilt wieder zu entfernen. da kann man nicht einfach mit einem goto in die main springen und den ganzen mit liegen lassen wo er war.

    vieleicht konkretisierst du dein problem etwas, damit man ein besseres verständniss dafür bekommt.

    exceptions sind zur fehlerbehandlung gedacht und nicht um rückgaben zu realisieren oder änliche perverse ideen.



  • jo also ich hab sowas ->

    foo {
    bla();
    }
    
    bla() {
       foofoo();
    }
    
    foofoo() {
        if(Bedingung){
           Abbruch;
        }
    
    }
    
    main() {
    foo();
    }
    

    wenn ich nun nach foofoo hinuntersteige und eine bedingung ist erfüllt will ich einfach aus der ganzen rek Funktion aussteigen und hinter foo() weitermachen nur wie am schnellsten u besten? ohne dass ich wieder hinaufsteigen muss?



  • ich hab in dem code noch keine rekursion gesehen 😞

    Ich sehe natürlich nicht ob deine funktionen irgendwelche anderen rückgabewerte haben, aber ich würde einfach einen status zrückgeben nach dem dann entschieden werden kann wie es weiter geht. andere rückgabewerte ggf als parameter mit geben.

    aber nix mit springen, für jeden funktionsaufruf muss ein return ausgeführt werden.


Anmelden zum Antworten