You are not logged in.

  • Login

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Monday, November 16th 2009, 5:08pm

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 =)

2

Monday, November 16th 2009, 6:56pm

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.

Java 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:

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

3

Monday, November 16th 2009, 7:09pm

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?

4

Monday, November 16th 2009, 8:26pm

Kurz google bemüht und hier hast du eine Liste der Datentypen

Similar threads

Social bookmarks