WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Zähler einfügen in Fibonacci Funktion

 

Extremes

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.05.2012, 20:03     Titel: Zähler einfügen in Fibonacci Funktion
  Antworten mit Zitat      
Hallo,

ich habe eine kleine Frage und gehe mal davon aus, dass ich hier Hilfe finden werde.

Ich sitze an der Aufgabe die n-te Fibonacci Zahl rekursiv zu berechnen.
Das ist nun kein Problem, das habe ich ohne weiteres geschafft.

Zusatz der Aufgabe ist es, wahrscheinlich um deutlich zu machen, dass die rekursive Berechnung ungünstig ist, einen Zähler einzubauen, der sich um 1 erhöht, jedesmal, wenn die Funktion aufgerufen wird. Das heißt also bei jedem neuen fibonacci(...).

Dies ist mein bisheriges Programm

Code:
%

function [fib, zaehler] = fibonacci(n, zaehler)
% Berechnet die n-te Fibonacci Zahl rekursiv

  % Falls n gleich 0 ist, so ist auch fib=0
        if n==0
            fib = 0;
            return;
  % Falls n gleich 1 oder n gleich 2 ist, dann ist fib=1
        elseif n<3;
            fib = 1;
            return;
  % Falls n größer gleich 3 ist, so wird rekursiv gerechnet
        else
            fib = fibonacci(n-1,zaehler) + fibonacci(n-2,zaehler);
            return;
        end

end
 


Mein Problem ist jetzt, an welche Stelle ich den Zähler noch einsetzen muss und mit welcher Schleife o.Ä.

Habe es schon mit einer Hilfsvariablen mit for-Schleife um den kompletten Programmcode herum versucht.
Weitere Versuche sind ebenfalls gescheitert.

Langsam glaube ich vielleicht auch, dass ich schon zu lange an der Aufgabe sitze und "den Wald vor lauter Bäumen nicht sehe".

Ich brauche Hilfe.
Danke im voraus


Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.05.2012, 06:46     Titel:
  Antworten mit Zitat      
Hallo,

mit der Hilfe von persistent habe ich es hinbekommen. Damit kannst du die Zählvariable abspeichern.

viele Grüße
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 16.05.2012, 08:29     Titel:
  Antworten mit Zitat      
Weder "persistent" noch "global" werden benötigt:

http://www.gomatlab.de/viewtopic,p,91048.html#91048
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.05.2012, 13:23     Titel:
  Antworten mit Zitat      
Die Lösung hat den Nachteil das man ein zweites Argument übergeben muss. Ausserdem bekomme ich bei

Code:

[fib,n] = fibonacci(3,0);
 


n = 1. Es sollte doch eher 3 herauskommen!?
Für Zahlen größer 3 kommt in meiner Berechnung immer n = fib*2-1 heraus, bei deiner n = fib*2-2.
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 16.05.2012, 14:13     Titel:
  Antworten mit Zitat      
Hallo Thomas,

die Übergabe eines zweiten Argumentes wird doch ohnehin vollzogen. Ich speichere dies doch nur ab. Insofern sehe ich keinen wirklichen Nachteil.

Den Rest deines Beitrages verstehe ich nicht so recht. Für fibonacci(3,0) ist der Zähler 5 und der Wert der Folge 2, wenn fibonacci(0,0):=0 und fibonacci(1,0):=1. Das ist die Standarddefinition.

Der Zähler lässt sich schon über n = fib*2-1 abschätzen. Dabei muss man aber das Argument um 1 erhöhen. Siehe Folgebeitrag.

Edit: Durch den "Trick" mit fib=1 für n=1 und n=2 wird die Rekursion erst ab n=3 aufgerufen. Das spart rekursive Aufrufe für n=2.

Grüße, Marc

Zuletzt bearbeitet von MaFam am 16.05.2012, 15:03, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 16.05.2012, 15:01     Titel:
  Antworten mit Zitat      
Der Zähler entspricht hier selbst einer Fibonacci-Folge. Es gilt:


<br />
a_n = a_{n-1} + a_{n-2} + 1,\ \  a_0 = a_1 = 1. 
<br />

Die explizite Folge lautet somit:


<br />
a_n = \frac{2}{\sqrt 5}*(\frac{1+\sqrt 5}{2})^{n+1} - \frac{2}{\sqrt 5}*(\frac{(1-\sqrt 5}{2})^{n+1} - 1
<br />

Diese kann auch über die ursprüngliche Folge ausgedrückt werden:


<br />
a_n=2*Fibonacci(n+1)-1
<br />

Dabei ist darauf zu achten, dass das Argument um 1 erhöht wird.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 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.