Nutzereingabe, Rekursion oder nicht

Moch

Bekanntes Mitglied
Hallo,
Ich schreibe derzeit zur Übung (Trimester ist ja bald wieder vorbei und dann kommen die Prüfungen wieder...) ein paar kleinere Programme (aus meiner Sicht zwar schon etwas größer, aber aus Eurer Sicht wird's winzig sein)
Unter Anderem sind es jetzt Programme, die interaktiv mit dem Benutzer umgehen. So habe ich beispielsweise eine per Nutzereingabe funktionierende While-Schleife (läuft ab, so lange der User bei jeder Abfrage wieder 'ja' eintippt, bricht ab bei 'nein'). Am Ende des Programms folgt meistens die Abfrage, ob der User das Spiel/Programm neu starten möchte. Dazu habe ich jetzt einmal eine Frage.

Erstmal ein (unvollständiges) Beispiel:
[Java]
import userFkt.Basis; //selbst geschriebenes Paket, um mir persönlich Schreibarbeit zu sparen)
public class Beispiel {
public static void main (String[] args){
Base alpha = new Base();
System.out.println("Möchten sie das Programm neustarten?");
System.out.println("Zum neustarten 'ja' (ohne ') eintippen, ansonsten 'quit'");
String s1 = alpha.eingabe(); //liest eine Nutzereingabe ein

if(s1.equals("ja")){
main(args);
}

}
}

[/Java]

Wie gesagt, hier nur ein unvollständiges und recht sinnfreies Beispiel.
Jetzt meine Frage dazu:

Entsteht hierbei eine Rekursion, die zu viele sinnlose Instanzen aufrechthält (nach einem Durchlauf ist diese ja nicht mehr nötig), wenn der User das Programm quasi endlos immer wieder aufruft?
Oder erkennt Java hier selbst, dass die älteren Instanzen unnötig sind und entfernt sie dann aus dem Speicher?

Ich bin normalerweise ein großer Freund iterativer Lösungen und mag Rekursionen nicht so gerne (spätestens seit Haskell *hasse* ich Rekursionen), aber hierbei gefällt mir die Variante ohne While-Schleife irgendwie besser (übersichtlicher).
Dennoch möchte ich natürlich nicht Gefahr laufen, bei größeren Programmen, wie unserem Software-Projekt, dass im Herbst-Trimester kommen soll, zu viele Ressourcen sinnlos zu verschwenden.

Dass es ansich ein rekursiver Aufruf ist, ist mir klar. Immerhin rufe ich in der laufenden Methode selbige wieder auf. Mir geht es nur darum, ob dieses Java-Speicheraufräum-Tool (Namen vergessen) selbstständig erkennt "aha, unnötige instanz -> weg" oder nicht.

lg
Moch
 
Zuletzt bearbeitet:
Eine Rekursion entsteht dann, wenn eine Prozeudur sich selbst wieder aufruft.

Wo befürchtest du denn, dass das passiert?
 
Zuletzt bearbeitet:
Na wenn er die main innerhalb der main-methode wieder aufruft. Das ist schon eine Rekursion. Es gibt Umgebungen, die mit sowas umgehen können unter bestimmten Bedingungen.
Lua kann das soweit ich weiß, wenn es der allerletzte Befehl eines Blocks ist. Was java da macht, kann ich nicht sagen, schätze aber dass es genau den erwarteten "Fehler" bringt.

Pack doch mal einen Zähler rein für die Instanzen, oder schau es im Debugger an, oder benutz den Profiler.

Grundsätzlich macht man da eher eine Schleife und springt an den Anfang der Funktion zurück, anstatt sie "nested" aufzurufen.
 
Danke für das Ändern des Fehlers. Sorry!

Ich meine den erneuten Aufruf der main in Zeile 10.

Es ist ja ein Aufruf der main, in der main selbst.
Also ruft doch die main sich selbst wieder auf oder täusche ich mich da?

Edit: Danke! Ich werde mir das mal anschauen, wie sich das verhält. Wie gesagt: Normalerweise bevorzuge ich Schleifen, aber irgendwie war es hier so bequemer ^^
 
Zuletzt bearbeitet:
das Base-Objekt jedes Aufrufs wird in diesem Fall tatsächlich theoretisch im Speicher gehalten,
ob Java von selber entsprechendes erkennt, kann ich nicht sagen,
helfen würde alpha=null; vor dem Rekursionsaufruf,

ansonsten gibt es noch die main-Methode an sich, bei jedem rekursiven Aufruf wird sich der Aufrufer gemerkt, der StackTrace von Exceptions wird sehr lang,
der Stack im Arbeitsspeicher gefüllt, bei Standardeinstellungen gibt es nach ein paar Tausend Runden eine StackOverflowException,
dagegen gibts auch keine Optimierung,

schlimm muss all das nicht sein, es gibt wohl kein Programm der Welt, wo jemand überhaupt 1000x 'ja' eintippt,
ob 10 Base-Objekte schon schlecht sind, musst du selber wissen


wann immer eine Schleife einfach möglich ist, solltest du aber wirklich in Betracht ziehen,
paar Code-Zeilen mehr sind doch kein Argument,
evtl. getrennt in main mit Schleife und Untermethode

Java:
public class Test {

    public static void main(String[] args)  {
        while (run());
    }

    private static boolean run() {
        // hier natürlich eher dein Programm, am Ende false zurückgeben wenn Abbruch
       
        System.out.println("run");
        return (Math.random() < 0.2);
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Da täuschst dich nicht, aber warum fragst du denn, ob es eine Rekursion ist. Es ist eine!

Bei einer Rekursion stellen sich immer (mindestens!) zwei Fragen:
- Ist die Rekursion nötig oder ist das Problem anders zu lösen, wenn ja, im Zweifelssfall KEINE Rekursion machen.
----> Es ist anders zu lösen (wurde ja schon diskutiert)

- Wie bricht die Rekursion ab
----> Benutzereingabe und sonst nicht -> gefährlich.
 

Zurück
Oben