|
|
Fibonacci-Zahlen möglichst effizient |
|
Apoo |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 04.06.2019, 18:06
Titel: Fibonacci-Zahlen möglichst effizient
|
|
|
|
|
Hallo zusammen,
ich hätte hier eine Frage bzw. Aufgabenstellung, zu der ich gerne eure Meinung wissen würde:
Ich soll eine Matlab-Funktion definieren, die zu ihrem Argument die entsprechende Fibonacci-Zahl berechnet. Dabei ist darauf zu achten, dass der Programmtext möglichst kurz ist (also möglichst wenig Zeilen) und die Laufzeit für ein (großes) Argument möglichst kurz ist.
Meine erste Idee war, die Fibonacci-Zahlen rekursiv zu berechnen:
Was die Kürze des Programmtextes angeht, ist das wohl kaum zu übertreffen. Allerdings meine ich gehört zu haben, dass rekursive Programme im Allgemeinen (bzw hier für große Argumente) langsamer sind als die iterativen Varianten.
Deshalb war meine zweite Idee folgende:
Jetzt würde mich interessieren, welche Variante ihr unter den oben genannten Bedingungen empfehlen würdet?
Vielen Dank für eure Hilfe!
PS: Ich hoffe dass die Programme soweit stimmen, ich bin noch nicht dazu gekommen, sie auszutesten.
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 04.06.2019, 19:21
Titel:
|
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 07.06.2019, 16:14
Titel: Re: Fibonacci-Zahlen möglichst effizient
|
|
|
|
|
Hallo Apoo,
Wie Harald schon erwähnte - Formel von Binet:
Das ist von der Laufzeit für große n natürlich deutlich besser als Rekursionen oder Iterationen. Mit
pow2(n)
wäre es noch ein bisschen effizienter als mit dem allgemeinen
2^n
.
Vielleicht ist die Umformung auch schneller:
Oder noch besser mit Konstanten:
Im rekursiven Code kannst Du:
vereinfachen zu:
Oder noch kompakter:
Deinen nicht-rekursiven Code kann man auch noch zusammenfassen:
Das ist zwar schön einfach, aber grottig langsam.
Das benötigt auf Matlab-Online 0.18 sec, mit fibo5 14 sec und das rekursive fibo4 rattert seit Minuten vor sich hin. Ich nehme an, eine lokale Matlab Installation ist da schneller.
Zum Vergleich wäre noch eine Look-up-Tabelle sinnvoll. Inputs oberhalb von 1475 ergeben Inf, es reicht also die ersten 1474 Werte zu berechnen:
Das ist in Matlab Online langsamer als fibo3, aber das solltest Du auch noch mal messen.
Nun habe ich deine Aufgabe noch nicht ganz gelöst - zum Glück. Es bleibt noch zu entscheiden, ob Code-Länge, Laufzeit oder Code-Komplexität wichtiger sind.
Gruß, Jan
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2024
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|