Recursion mit Zinseszins rechnen

Mikejr

Mitglied
Java:
Public class ZinsenRechner {
    
    public static double berechneZinsen(double guthaben, double zinssatz, int jahre){
        while (jahre == 0) {
            return guthaben;
        }
        guthaben = guthaben * berechneZinsen(guthaben,zinssatz,jahre-1);
        return guthaben;
    }
    public static void main(String[] args) {

        System.out.println(berechneZinsen(10,10,1));
        System.out.println(berechneZinsen(10,10,2));
        System.out.println(berechneZinsen(10,10,3));
    }
}

Hallo zusammen ich muss eine Implementiereung schreiben womit ich die Zinsen rechnen kann, die aufgabe muss mit einer rekursion geschrieben werden.
 

KonradN

Super-Moderator
Mitarbeiter
Wo ist denn das Problem? Prinzipiell hast Du doch eine Lösung mit Rekursion erstellt oder nicht?

Ok, Du hast da noch ein while und damit eine Schleife. Aber wie oft wird diese durchlaufen? Was schreibt man da ggf. besser?

Edit: Und die Ergebnisse / Formel sollte man sich ggf. noch ansehen :)
 

Neumi5694

Top Contributor
An dieser Stelle eine While-Bedingung einzusetzen, finde ich übrigens sehr originell. Erstaunlich ist, dass es sogar funktionieren würde, wobei ich sicherheitshalber auf <=0 prüfen würde. Man weiß ja nie.
 

Jw456

Top Contributor
Die Formel für den Zinseszins sollte man schon beachten.
 

Neumi5694

Top Contributor
Die Formel für den Zinseszins sollte man schon beachten.
Schon, aber kommt mehr raus, wenn man das Guthaben mit sich selbst multipliziert anstatt mit dem Zinssatz. Außerdem ist die Währung dann auch €^n. Wer hätte denn nicht gern einen quadratischen oder gar kubischen Euro?
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Ich weiß wie eine Rekursion funktioniert, aber nach 5 Stunden ohne erfolg kann man ja Fragen.
Gut, dann wollen wir mal und zwar ganz ohne Formelsammlung :)

Wir bringen ein Anfangskapital K zur Bank und lassen es dort mit einem Zinssatz p pro Jahr verzinsen (jährliche, endfällige Auszahlung). D. h. der Kontostand besteht aus zwei Komponenten, nämlich dem Anfangskapital und der Summe der bis zum betrachteten Zeitpunkt angefallenen Zinsen Z. Sei Z_n die Summe der nach n Jahren angefallenen Zinsen. Z_0 ist logischerweise 0, da nach 0 Jahren auch noch keine Zinsen angefallen sind.

Was aber ist nun Z_n? Naja, offensichtlich ist Z_n die Summe der nach n-1 Jahren angefallenen Zinsen plus den Zinsen, die im Jahr n anfallen. Die Zinsen, die im Jahr n anfallen, ist der Kontostand nach n-1 Jahren multpiliziert mit dem Zinssatz p. Der "Kontostand nach n-1 Jahren" ist aber nichts anderes als das Anfangskapital plus der Summe nach n-1 Jahren angefallenen Zinsen, also K + Z_{n-1}. Die Zinsen im Jahr n sind somit (K + Z_{n-1}) * p. Die Summe der Zinsen nach n Jahren ist folglich Z_n := Z_{n-1} + (K + Z_{n-1}) * p = Z_{n-1} + Kp + Z_{n-1}*p = Z_{n-1} * (1 + p) + Kp für n > 0 und Z_0 := 0.

Damit haben wir eine rekursive Definition der Summe der Zinsen nach n Jahren, die sich praktisch 1:1 umsetzen lässt.
 

Mikejr

Mitglied
Java:
public static double berechneZinsenRekursiv(double guthaben, double zinssatz, int jahre) {

        double zins = guthaben*(zinssatz/100);
        guthaben = guthaben + zins;

        if (jahre == 1) {
            return guthaben;
        }else {
           return berechneZinsenRekursiv(guthaben, zinssatz, jahre-1);
        }
    }
public static void main(String[] args) {
    System.out.println(berechneZinsenRekursiv(10,10,1);
    System.out.println(berechneZinsenRekursiv(10,10,2);
    System.out.println(berechneZinsenRekursiv(10,10,3)                   
}

Hier ist die Lösung, danke für all die Nachrichten waren sehr hilfreich.
 

berndoa

Top Contributor
Muss mal kurz fragen, funktioniert das wirklich so dass ein Methodenparameter auch schreibend bearbeitet wird?
Also so wie hier, das wir eine guthaben zahl als input haben und dieser in der Methode ein neuer Wert zugeordent wird?

Ansosnten würde ich an deienr Stelle sichehreitshalber nochmal durchgucken ob die NAzahl an Multiplikationen aktuell so stimmt.
Also wenn du bspw, 5 jahre angibst, ob dann auch letztlich 5 Multipilkationen (oder nur 4) gewollt sind und auch gemacht werden.
Weil je nachdem wäre jahre==1 oder jahre==0 der Basisfall.
 

mihe7

Top Contributor
Muss mal kurz fragen, funktioniert das wirklich so dass ein Methodenparameter auch schreibend bearbeitet wird?
Also so wie hier, das wir eine guthaben zahl als input haben und dieser in der Methode ein neuer Wert zugeordent wird?
Sicher, Parameter sind wie lokale Variablen. Ob man das allerdings tun sollte, ist eine andere Frage.
 

berndoa

Top Contributor
Ich glaube ich weiß wo meine Verwirrung herstammt:
Ich erinnerte mich dran an ein Beispiel aus der Vorlesung wo es um sowas ging wie


Java:
int a=5;

public void aenderung(int zahl){
    zahl=7;
}

aenderung(a);

Wo es drum ging dass (wider Erwarten?) a nicht geändert wird, weil beim Einsetzen in die Methode das in der Methode nur eine Kopie von der globalen variable ist und daher Änderungen an Inputparametern in der Methode keine Auswirkungen auf Variabeln ausserhalb haben.
Weil naiv könnt eman oben ja denken, ich stecke a rein,d as wird von 5 auf 7 geändert, fertig.
Aber die Methode benutzt eine Kopie der Zahlb und daher bleibt das ursprüngliche a unberührt.

Das gilt natürlich nicht für Referenztypen sondern nur für primitives wie int boolean und so.

Aber ja, damit hatte ich das gerade verwechselt.

WObei ich beim Thema hier trotzdem nie direkt den Inputparameter nutzen würde (obwohl wohl zulässig) sondern erst eine Kopie machen und der den Wert zuweisen würde. ABer Geshcmackssache, zulässig ist wohl Beides :)
 

temi

Top Contributor
Das gilt natürlich nicht für Referenztypen sondern nur für primitives wie int boolean und so.
Das war auch nicht deine Frage. :) Der Inhalt der Parametervariablen "zahl" wird ja tatsächlich geändert. Wenn du ihn innerhalb der Methode wieder verwendest, dann hat er den Wert 7.

Und der Rest gilt auch für Referenztypen. Du kannst innerhalb der Methode dem Parameter (als Referenztyp) zwar etwas zuweisen, aber es handelt sich um eine Kopie der Referenz. Was du dagegen tun kannst, ist den Zustand des referenzierten Typen ändern (sofern dieser das zulässt).

EDIT: Beispiel
Java:
public class Refererenzen {

    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Hallo");

        System.out.println(sb); // Hallo
        doSomething1(sb);
        System.out.println(sb); // Hallo Welt
        doSomething2(sb);
        System.out.println(sb); // Hallo Welt
    }

    static void doSomething1(StringBuilder stringBuilder) {
        stringBuilder.append(" Welt"); // das geht!
    }

    static void doSomething2(StringBuilder stringBuilder) {
        stringBuilder = new StringBuilder("Geht nicht!"); // das nicht
    }
}
 
Zuletzt bearbeitet:

temi

Top Contributor
WObei ich beim Thema hier trotzdem nie direkt den Inputparameter nutzen würde (obwohl wohl zulässig) sondern erst eine Kopie machen und der den Wert zuweisen würde.
Es kann durchaus sinnvoll sein, der Parameter direkt final zu machen, dann passiert das auch nicht aus Versehen.
Java:
 static void doSomething2(final StringBuilder stringBuilder)
    stringBuilder = new StringBuilder("Geht nicht!"); // Fehler beim Übersetzen!
 }
 

berndoa

Top Contributor
Es gibt also alle möglichen Varianten, die möglich sind doer auch nicht.
Wobei das final das generell unterbindet.
Ich werde es so halten, wie ich es bisher eh praktizierte:
Falls ich in einer Methode einfach nur eine globale Variable ändern will, tu ich das durch direkten Zugriff auf die Variable


Java:
int a=5;

public void increaseA(){
    a++;
}

increaseA();
System.out.println(a);
//sollte 6 ausgeben


Oder falls ich was berechne und gebenenfalls ausgebe, was mittels der input Parameter berechnet wird, nutze ich eine neu gebaute Variable.
Und versuche keine unschönen Veränderungen am input Parameter selbst, da das nur zu Problemen führt.

Code:
int a=berechneQuadrat(5);

public int berechneQuadrat(int zahl){
    int ergebnis=zahl*zahl;
    return ergebnis;
    //return (zahl*zahl) ginge auch, aber es geht ja ums Prinzip gerade
}


Denke, damit fahre ich recht gut um erst gar nicht mit dieser Art von Fehlern rechnen zu müssen :)
 

berndoa

Top Contributor
Das war auch nicht deine Frage. :) Der Inhalt der Parametervariablen "zahl" wird ja tatsächlich geändert. Wenn du ihn innerhalb der Methode wieder verwendest, dann hat er den Wert 7.

Und der Rest gilt auch für Referenztypen. Du kannst innerhalb der Methode dem Parameter (als Referenztyp) zwar etwas zuweisen, aber es handelt sich um eine Kopie der Referenz. Was du dagegen tun kannst, ist den Zustand des referenzierten Typen ändern (sofern dieser das zulässt).
Klar, ich dachte da eher dran bspw. bei einem String dessen "Wert" zu ändern, also ein "a" anzuhängen oder so.
Wegen Aliasing und Co. verweist ja auch die Kopie aufs Selbe Objekt.
Man kann zwar nicht ändern dass die Ursprungsvariable auf dieses Objekt zeigt , aber das dahinterliegende Objekt kann trotzdem verändert werden (Was manchmal recht praktisch sein kann).

Nur wenns um primitive Datentypen geht, die einer Variabeln zugewiesen wurden, da lässt sich mittels inputparameter-tuereien nichts ändern.

Aber so oder so kein guter Stil, einen input ändern zu wollen.
Der ist ja nur dazu da um Infos zu liefern
 

KonradN

Super-Moderator
Mitarbeiter
Klar, ich dachte da eher dran bspw. bei einem String dessen "Wert" zu ändern, also ein "a" anzuhängen oder so.
Ein String ist konstant und kann nicht geändert werden. Siehe:

Das ist also ein schlechtes Beispiel. Wenn ein Objekt einen veränderbaren State hat, dann wäre dieser veränderbar. Damit hast Du natürlich Recht (Auch wenn dies gekapselt sein sollte, so dass Du auf dem Objekt nur Methoden aufrufen können solltest - das ist aber eine Design Frage und wird natürlich nicht von Java erzwungen).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
JAnruVA Datentypen Berechneten String-Wert in Double umwandeln um weiter zu rechnen Allgemeine Java-Themen 7
B Parameter Konstruktor plus rechnen Allgemeine Java-Themen 6
P Rechnen mit sehr kleinen Zahlen Allgemeine Java-Themen 5
KeexZDeveoper Schnelleres Rechnen Allgemeine Java-Themen 8
J-Gallus Erste Schritte Wahrscheinlich Anfänger Fehler beim rechnen. Falsches Ergebnis. Allgemeine Java-Themen 9
A Mit dem letzten bis zum ersten Wert aus Array rechnen Allgemeine Java-Themen 15
M Probleme beim rechnen, bei Zahlen mit führenden Nullen. Allgemeine Java-Themen 7
J zu blöd zum rechnen Allgemeine Java-Themen 7
F Taschenrechner Term rechnen Allgemeine Java-Themen 4
S Java rechnen mit unbekannten Allgemeine Java-Themen 11
M Rechnen mit kleinen Zahlen langsamer!? Allgemeine Java-Themen 11
B Fehler beim Rechnen mit Floats Allgemeine Java-Themen 3
B Rechnen mit mehreren Variablen Allgemeine Java-Themen 2
M In einer Tabelle rechnen Allgemeine Java-Themen 12
H Mit String rechnen Allgemeine Java-Themen 14
hdi Probleme beim Rechnen mit BigDecimal Allgemeine Java-Themen 5
E Konstante Zahl Threads parallel rechnen lassen Allgemeine Java-Themen 6
O "Rechnen" mit Farben Allgemeine Java-Themen 12
T Mit Datum und Zeit rechnen Allgemeine Java-Themen 8
M Rechnen mit sehr kleinen Zahlen Allgemeine Java-Themen 8
G Probleme mir Rechnen Allgemeine Java-Themen 5
P rechnen mit extrem grossen zahlen Allgemeine Java-Themen 2
H Komplexes Rechnen mit Java Allgemeine Java-Themen 6
S Rechnen mit float Zahlen Allgemeine Java-Themen 2
O Java zu blöde um 1-1 zu rechnen?? Allgemeine Java-Themen 20

Ähnliche Java Themen

Neue Themen


Oben