1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Forum
  3. Sonstiges
  4. Off-Topic

rekursivität :(

  • anno2008
  • 27. Oktober 2008 um 19:52
1. offizieller Beitrag
  • anno2008
    Lernender
    Beiträge
    992
    • 27. Oktober 2008 um 19:52
    • #1

    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

  • BugFix
    aka McBarby
    Reaktionen
    7
    Beiträge
    11.162
    • 27. Oktober 2008 um 20:12
    • Offizieller Beitrag
    • #2

    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.

    MfG BugFix

    Mein Git | Meine UDF | Array-Tutorial | Bit-Tutorial | Dll-Tutorial | RegExp-Beispiel

    • Nächster offizieller Beitrag
  • anno2008
    Lernender
    Beiträge
    992
    • 27. Oktober 2008 um 21:07
    • #3

    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 ;(

  • BugFix
    aka McBarby
    Reaktionen
    7
    Beiträge
    11.162
    • 27. Oktober 2008 um 21:23
    • Offizieller Beitrag
    • #4

    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.

    MfG BugFix

    Mein Git | Meine UDF | Array-Tutorial | Bit-Tutorial | Dll-Tutorial | RegExp-Beispiel

    • Vorheriger offizieller Beitrag
    • Nächster offizieller Beitrag
  • anno2008
    Lernender
    Beiträge
    992
    • 27. Oktober 2008 um 21:53
    • #5

    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:

  • BugFix
    aka McBarby
    Reaktionen
    7
    Beiträge
    11.162
    • 27. Oktober 2008 um 21:56
    • Offizieller Beitrag
    • #6

    Freut mich, wenn es dir ein Lichtlein entzündet hat :rofl: - immer wieder gern.

    MfG BugFix

    Mein Git | Meine UDF | Array-Tutorial | Bit-Tutorial | Dll-Tutorial | RegExp-Beispiel

    • Vorheriger offizieller Beitrag
    • Nächster offizieller Beitrag
  • peethebee
    Schon soooo lange hier!
    Reaktionen
    9
    Beiträge
    5.383
    • 27. Oktober 2008 um 22:45
    • Offizieller Beitrag
    • #7

    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

    Mein Blog mit AutoIt-Buch und ausgewählte UDFs: Logging, Einstellungen lesen, Eingaben filtern

    • Vorheriger offizieller Beitrag
    • Nächster offizieller Beitrag
  • BugFix
    aka McBarby
    Reaktionen
    7
    Beiträge
    11.162
    • 27. Oktober 2008 um 22:51
    • Offizieller Beitrag
    • #8

    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.

    MfG BugFix

    Mein Git | Meine UDF | Array-Tutorial | Bit-Tutorial | Dll-Tutorial | RegExp-Beispiel

    Einmal editiert, zuletzt von BugFix (27. Oktober 2008 um 23:00)

    • Vorheriger offizieller Beitrag
    • Nächster offizieller Beitrag
  • eukalyptus
    koala's favourite
    Reaktionen
    6
    Beiträge
    1.166
    • 27. Oktober 2008 um 23:37
    • #9

    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

    gaffer holds the universe together...

    Direct2D-UDF
    DirectSound-UDF

  • BugFix
    aka McBarby
    Reaktionen
    7
    Beiträge
    11.162
    • 28. Oktober 2008 um 00:06
    • Offizieller Beitrag
    • #10

    OK, ich sehe es funktioniert - aber es erschließt sich mir nicht (vllt. auch zu spät heut).
    Also erst mal drüber schlafen.

    MfG BugFix

    Mein Git | Meine UDF | Array-Tutorial | Bit-Tutorial | Dll-Tutorial | RegExp-Beispiel

    • Vorheriger offizieller Beitrag
  • anno2008
    Lernender
    Beiträge
    992
    • 28. Oktober 2008 um 17:59
    • #11

    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;

    .

  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™