1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Runde 1 Entwerfen eines mathematischen Algorithmus

  • HTM
  • 18. Oktober 2007 um 11:17
  • Unerledigt
  • HTM
    3
    HTM
    Mitglied
    Punkte
    60
    Beiträge
    9
    • 18. Oktober 2007 um 11:17
    • #1

    Hallo Leute!

    Ich bin gerade bei der 2.Runde und weiß absolut nicht wie ich da anfangen soll, hat wer ebenfalls so ein ähnliches Beispiel bekommen??
    Kann mir irgendwelche Tipps geben wie man hier am besten vorgeht!

    Danke im Voraus
    prolog übung - Runde 2


    Kurzbeschreibung


    Aufgabe der zweiten Runde ist das Entwerfen eines mathematischen Algorithmus und Umsetzen in Java. Thema: Fibonacci-Folge Lösungshinweise


    Sie k?nnen wie im letzten Beispiel, Pseudocode schreiben, und/oder auch ein Struktogramm mit Nessi entwerfen und im Abgabearchiv mitliefern. Verplichtend ist nur die Abgabe des Java-Programmes. Aufgabenstellung


    Eine "Fibonacci-Folge" ist eine Folge von positiven, ganzen Zahlen f(0), f(1), f(2), ...
    Die ersten beiden Zahlen der Folge sind:
    f(0) = 1
    f(1) = 1
    Alle weiteren Folgenelemente sind definiert durch die "rekursive" Formel:
    f(n) = f(n-1) + f(n-2)
    d.h. jedes Element der Folge ist die Summe seiner beiden Vorg?nger.
    Der Anfang der Folge lautet also:
    1, 1, 2, 3, 5, 8, ... Schreiben Sie ein Java-Programm "Fibonacci", dass einen Zahlenwert n einliest und das Element f(n) ausgibt.

  • Horrendus
    7
    Horrendus
    Mitglied
    Punkte
    520
    Beiträge
    92
    • 18. Oktober 2007 um 11:36
    • #2

    Wow, für den Prolog ist das recht heftig find ich :winking_face:

    Am einfachsten ist das ganze rekursiv zu lösen, was aber ein kleiner Vorgriff wär.
    Ob es ohne Rekursion überhaupt lösbar ist ... keine Ahnung.

    lg Stefan

  • WolfB
    7
    WolfB
    Mitglied
    Reaktionen
    2
    Punkte
    467
    Beiträge
    93
    • 18. Oktober 2007 um 11:44
    • #3
    Zitat von Horrendus

    Ob es ohne Rekursion überhaupt lösbar ist ... keine Ahnung.


    Also sollte eigentlich mit for auch möglich sein

  • Paulchen
    1
    Paulchen
    Gast
    • 18. Oktober 2007 um 11:46
    • #4
    Zitat von Horrendus

    Ob es ohne Rekursion überhaupt lösbar ist ... keine Ahnung.

    Natürlich, sogar effizienter als der "naive" rekursive Ansatz, der zum Beispiel für n=5 rechnet: f(5) = f(3)+f(4) = f(1)+f(2)+f(4) = f(1)+f(0)+f(1)+f(4) = f(1)+f(0)+f(1)+f(2)+f(3) = f(1)+f(0)+f(1)+f(0)+f(1)+f(3) = f(1)+f(0)+f(1)+f(0)+f(1)+f(1)+f(2) = f(1)+f(0)+f(1)+f(0)+f(1)+f(1)+f(0)+f(1) = ...

    Man kann das auch in einer Schleife bearbeiten, die f(2) aus f(1) und f(0) berechnet (diese beiden Werte sind ja von Anfang an bekannt) und das Ergebnis zwischenspeichert. Dann wird f(3) aus f(2) und f(1) berechnet, das Ergebnis wird wieder abgespeichert usw. Als Datenstruktur zum Abspeichern der Zwischenergebnisse kann man ein Array verwenden.

    Dieser Ansatz rechnet:
    f(2) = f(1)+f(0)
    f(3) = f(2)+f(1)
    f(4) = f(3)+f(2)
    f(5) = f(4)+f(3)

    Man sieht: Das sind bedeutend weniger Rechenoperationen.

  • HTM
    3
    HTM
    Mitglied
    Punkte
    60
    Beiträge
    9
    • 18. Oktober 2007 um 12:12
    • #5

    Horrendus: ja eh ich dachte das ist so ne Art Übung wo ich die Anfängerkenntnisse
    Einheimsen kann*lol*! Aber naja scheint irgendwie härter zu sein als die 3.ersten Runden des Eprogs und das wird nicht einmal als Studium angerechnet!


    @Paulchen du hast nicht zufällig ein ähnliches Beispiel, dass ich hernehmen könnte(als Muster) um nachvollziehen zu können wie es funktioniert??
    Naja komme aus einer AHS und soweit bin ich halt noch nicht :frowning_face:

  • Horrendus
    7
    Horrendus
    Mitglied
    Punkte
    520
    Beiträge
    92
    • 18. Oktober 2007 um 12:17
    • #6

    Paulchen hat es ehh schon gesagt.

    Du brauchst 3 Variablen:

    1 für f(n)
    1 für f(n-1)
    1 für f(n-2)

    Jetzt machst du eine Schleife von 2 (die erste f(n) die man berechnen muss) bis n

    Was machst du in der Schleife?

    Du berechnest f(n) aus den Variablen für f(n-1) und f(n-2) (welche du für 2 ja bereits weisst).
    Danach ersetzt du den Wert in f(n-2) durch den Wert von f(n-1) und den Wert von f(n-1) durch den Wert von f(n)

    Und nach der Schleife gibst du halt dann f(n) aus.

    lg Stefan

  • Horrendus
    7
    Horrendus
    Mitglied
    Punkte
    520
    Beiträge
    92
    • 18. Oktober 2007 um 12:31
    • #7

    Stimmt, geht auch ohne Rekursion sehr einfach zu lösen.

    Irgendwie kann man mit Linux ja ziemlich einfach die Runtime von Programmen ausgeben lassen ... wär bei Fibonacci sehr interessant die 2 Implementierungen zu vergleichen :winking_face:

    lg

  • cheezle
    1
    cheezle
    Mitglied
    Punkte
    5
    Beiträge
    1
    • 18. Oktober 2007 um 14:35
    • #8

    Horrendus

    ich würde eher sagen die schleife von 1 bis n, nicht von 2 bis n

  • Horrendus
    7
    Horrendus
    Mitglied
    Punkte
    520
    Beiträge
    92
    • 18. Oktober 2007 um 15:05
    • #9

    Hallo,

    nein 2 bis n passt schon super, weil vor 2 musst du ja keine einzige Fakultät berechnen sondern hast sie schon gegeben (f(0) = f(1) = 1).

    lg Stefan

  • Paulchen
    1
    Paulchen
    Gast
    • 18. Oktober 2007 um 16:02
    • #10
    Zitat von Horrendus

    Irgendwie kann man mit Linux ja ziemlich einfach die Runtime von Programmen ausgeben lassen ... wär bei Fibonacci sehr interessant die 2 Implementierungen zu vergleichen :winking_face:

    Ich hab beide Algorithmen mal schnell in C implementiert. Bei f(10) fällt der Unterschied noch nicht so auf (bei mir 14 µs gegen 2 µs), aber bei f(50) schon beträchtlich: Bei meinem Testlauf hat die eine Implementierung 393736469 µs gebraucht (das sind über sechs Minuten), die andere lediglich 5 µs.

  • Horrendus
    7
    Horrendus
    Mitglied
    Punkte
    520
    Beiträge
    92
    • 18. Oktober 2007 um 18:02
    • #11

    Das ist ein heftiger Unterschied. Thx Paulchen fürs ausprobieren.

    lg Stefan

  • shebang
    7
    shebang
    Mitglied
    Reaktionen
    1
    Punkte
    456
    Beiträge
    74
    • 19. Oktober 2007 um 07:41
    • #12

    horrendus hat es in post #6 eh schon ganz gut erklärt. aber weils anscheinend immer noch nicht klar ist:
    wenn du es nicht rekursiv machen willst, weil du mit funktionen noch nicht so fit bist geht es auch nur mit einer for-schleife. wenn n 0 oder 1 ist brauchst nur 1 ausgeben und eigentlich gar nix berechnen. sonst brauchst drei variablen. eine für das aktuelle n (sage wir i), eine für i-1 und eine für i-2.
    das i steigerst du von anfangs 2 bei jedem schleifendurchlauf um 1 bis es das geforderte n erreicht. in der schleife berechnest du die neuen werte. wichtig ist die reihenfolge, damit du dir nichts überschreibst was du noch brauchst :winking_face:
    f(i)=f(i-1)+f(i-2)
    f(i-2)=f(i-1)
    f(i-1)=f(i)

    jagt die jäger aus dem wald :: 667 - the neighbour of the beast

  • luna09
    3
    luna09
    Mitglied
    Punkte
    80
    Beiträge
    14
    • 22. Oktober 2009 um 23:32
    • #13

    oder man schreibt ein for, in dem man einfach das n immer zu einer summe zählt, so kommst du auch zur folge....

    summe = 1;
    dann die abfrage, ob das n 1 oder zwei ist, wenn es aber großer ist, startest du eine forschleife die immer das macht:

    solange kleiner als n
    summe = summe + i;


    also ich habs bewusst so schwammig reingeschrieben, weil die fibonacci-folge doch noch etwas leichter ist als zB die annäherung von pi.
    da kapier ich ja nichtmal die formel....

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung