• Hi,
    ich bin am Informatik lernen und gleich am verzweifeln ;( .

    Zitat

    Schreiben sie ein rekursives Programm, das das Gesamtkapital K einer Geldanlage K0 bei Verzinsung p nach n Jahren berechnet.

    Also das wäre ja jetzt eine Funktion mit 3 Parametern.

    [autoit]


    Func berechnung($geld, $zinsen, $jahre)
    If ;abbruchbedingung then
    return ;irgendwas
    Else
    Return ;rekursive Funktion
    EndIf
    EndFunc

    [/autoit]

    Ich hab keine Ansatz wie ich das machen könnte.
    Ist hier vielleicht irgendjemand der mir gerade aus dem Stegreif sagen könnte wie man sowas macht? Entweder stehe ich gerade auf dem Schlauch oder ich kanns nicht :(

    Da es sich eigentlich nicht um ein Problem mit AutoIt Handelt hab ich es mal Off-Topic gemacht.

    Mit einer For-Schleife wäre es sooooo einfach, aber nei, scheiss rekursivtät.

    Bin echt mal gespannt :)

    Danke

    • Offizieller Beitrag

    Mal als Tipp, (bischen sollst du ja auch machen ;) )
    Ein rekursives Programm ruft sich selbst auf. Also erstellst du eine Funktion, die den Zinswert für einen Basiszeitraum errechnet. Das Ergebnis wird dem Ausgangswert hinzugefügt und damit die Funktion in sich selbst aufgerufen - sooft, wie der Basiszeitraum im gewünschten Zeitraum vorhanden.

  • Ich komme echt nicht drauf.
    Mit einfachen Funktion geht das ja noch, wenn man nur die Fakultät berechnen soll, aber ich weis nicht, wie ich die Jahre da mit einbeziehen soll.

    Zitat

    Also erstellst du eine Funktion, die den Zinswert für einen Basiszeitraum errechnet.

    Wie soll das gehen?

    Ich kapiers nicht ;(

    • Offizieller Beitrag

    OK, die Lösung ist so einfach, dass du dich in den Hintern beißen wirst ;)

    [autoit]

    Global $K0 = 1000
    Global $p = 2.5
    Global $n = 5
    Global $K

    [/autoit][autoit][/autoit][autoit]

    _Kapital($K0, $p, $n)

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, 'Gesamtkapital', Round($K, 2) & ' €')

    [/autoit][autoit][/autoit][autoit]

    Func _Kapital($K0, $p, $n)
    If $n = 0 Then
    $K = $K0
    Return
    EndIf
    $n -= 1
    _Kapital($K0 + ($K0 * $p / 100), $p, $n)
    EndFunc

    [/autoit]

    Wichtig: du kannst aus einer Rekursiven Funktion keinen Wert zurückgeben, deshalb die Globale Deklaration von $K.

  • DANKE BugFix.

    Zitat

    dass du dich in den Hintern beißen wirst ;)

    In AutoIt ist es aus irgendeinem Grund einfach aber sobald ich das in Delphi machen soll grig ich echt die Krise. Aber ich verstehe jetzt immerhin was ich falsch gemacht habe und hab noch ein bisschen Zeit zum üben :).

    Dankeschön :thumbup:

    • Offizieller Beitrag

    Ich würde Rekursion nicht mit globalen Variablen machen... ist meine Ansicht nach eine Abart ;).
    Ich kenne es so, dass man alles als Parameter weiterreicht (das illustriert auch besser, wie der Compiler den Stack mit den Aufruf-Variablen auf- und wieder abbaut).

    peethebee

    • Offizieller Beitrag

    Das hatte ich probiert, habs aber nicht lauffähig bekommen, deshalb der Umweg über die Globale Variable.
    Mach mal Pee ;)

    Edit:
    So war mein erster Gedanke

    [autoit]

    Func _Kapital($K0, $p, $n)
    If $n = 0 Then Return $K0
    $n -= 1
    _Kapital($K0 + ($K0 * $p / 100), $p, $n)
    EndFunc

    [/autoit]

    Da $K0 nach dem letzten Aufruf das Gesamtkapital darstellt (kann man in der ersten Zeile ausgeben lassen - stimmt), wäre es logisch diesen Wert mit Return zurückzugeben. Aber das verweigert AutoIt - gibt nur '0' aus. Und ich habe keinen Plan, wie ich den Wert außer über eine Globale Variable von der Funktion zurückbekomme.

  • na so:

    [autoit]

    Global $K0 = 1000
    Global $p = 2.5
    Global $n = 5

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, 'Gesamtkapital', Round(_Kapital($K0, $p, $n), 2) & ' €')

    [/autoit][autoit][/autoit][autoit]

    Func _Kapital($K0, $p, $n)
    If $n = 0 Then Return $K0
    $n -= 1
    $K0=_Kapital($K0 + ($K0 * $p / 100), $p, $n)
    Return $K0
    EndFunc

    [/autoit]

    lgE

  • Oh man.
    Ich bin so blöd. Das is ja ganz einfach 8| .
    Ich hab gar nicht dran, dass wenn ich die Variable $K0 mit dem Zinssatz multipliziere, dass die dann ja lokal so bestehen bleibt. Das war mein großer Denkfehler.

    Eigentlich macht die Funktion ja gar nichts anderes als

    [autoit]

    for $i = 1 to $jahre
    $K0 = $K0 * $zinssatz
    Next

    [/autoit]

    Nur dass es mit For-Schleife viel leichter anzuwenden ist :P .

    So, nochmal Danke :)
    Und ich hoffe, dass ich jetzt wenigstens das Prinzip verstanden habe und es auch anwenden kann :D.

    PS. (ist zwar eigentlich unwichtig aber dank euch läuft mein Programm ja jetzt) in Delphi sieht das jetzt so aus:

    Code
    function zins(geld,zinssatz:real;jahre:integer):real;
    begin
            if jahre = 0 then
                    zins := geld
            else
                    zins := zins(geld * (1 + zinssatz/100), zinssatz, jahre-1);
    end;

    .