BlueJ Rekursion

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • BlueJ Rekursion

    Guten Tag und zwar hätte ich eine Frage, zudem hier, warum krieg ich hier einen Stack Over Flow Error? & warum lassen sich Kommazahlen nicht mit 1.2 schreiben, da kommt dann immer " possible loss precision" oder wenn ich (120/100) zu 1.2 schreibe steht dort,
    Bakterien(float, int) in Rekursion cannot be applied to (double, int). Aber wieso ist n*1.2 auf einmal double?

    public float Bakterien(float n, int t)
    {
    int Zaehler = 0;
    if(Zaehler==t)
    {
    return n;
    }
    else
    {
    if(Zaehler<t)
    {
    Zaehler++;
    return Bakterien(n*(120/100),t);
    }
    else
    {
    System.out.println("Error");
    return 0;
    }
    }
    }
    danke =)
  • Also, Stack Overfloe errors bekommt man immer, wenn rekursionen zu "tief" werden, es also zuviele Rekursionsschritte gibt. Das passiert bei dir, weil du die Rekursionsabbruchbedingung nicht richtig implementiert hast.

    Quellcode

    1. int Zaehler = 0;

    hier setzt du in jedem Rekursionsschritt den Zähler wieder auf 0. Dadurch wird die rekursion immer wieder aufgerufen, da 0 immer kleiner als t ist (für ein positives t). Dadurch wird die Rekursion "unendlich"-oft aufgerufen, bis der Stack voll ist und du eben den Stack Overflow error bekommst. Daher musst du dir für die Abbruchbedingung etwas anderes einfallen lassen. Entweder du schleifst den Zähler durch jede Rekursionsstufe mit (dabei musst du den Zähler als 3. Parameter der Funktion mit übergeben) oder du lässt t einfach gegen 0 wandern. Also statt dass du einen Zähler jedesmal um 1 erhöhst bis er gleich t ist, ziehst du von t immer 1 ab, bis du bei 0 angekommen bist.

    Zu deinem Problem mit den Doubles: Java rechnet in der Regel immer mit doubles und nicht mit floats. Sobald du in einer Rechnung irgend einen Bruch oder eine "komma-zahl" angibst, rechnet Java das Ergebnis als Double aus. Da deine Funktion aber eine float erwartet (und float weniger genau ist als double) kommt die Meldung mit dem "precision loss". Die Meldung kannst du unterdrücken indem du explizit auf float castest:

    Quellcode

    1. (float)(1.2 * n)

    In dem Fall geht der Compiler davon aus, dass du weißt was du machst und dir des Präzisionsverlustes bewusst bist.
  • Danke auf den selben Gedanken bin später ich auch gekommen, aber hat da noch nicht funktioniert wegen dem float.
    Jetzt geht's - vielen dank
    In unserem Buch gibt es eine Liste mit so Teilen
    wie:
    Char, Short, Int,byte, long, float, double, boolean, string
    Gibst da noch mehr? Habt ihr irgentwo eine Liste?
    Gibt so was auch für Runden?
    Gibst irgentwie ein Wiki oder sowas wo das so drinsteht?