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

Matlab fibonacci Aufrufe mit Variable zaehler

 

latingirl
Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 11.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2012, 09:06     Titel: Matlab fibonacci Aufrufe mit Variable zaehler
  Antworten mit Zitat      
Hallo liebes Forum!

Es wurde bereits unter folgendem Link im Matlab-Forum dasselbe Thema diskutiert ...:
http://www.gomatlab.de/maximum-recu.....f-500-reached-t11351.html

... allerdings werden hier manche Befehle/Eingaben verwendet, v.a. eine globale Variable, die wir noch nicht in unsrem Matlab-Kurs hatten und die ich folglich nicht verwenden kann.

Also wie ich die Funktion fibonacci aufstelle ist mir klar, nur wie schaffe ich es, dass mir das System anzeigt, wie oft sich fibonacci selbst aufgerufen hat.
Als Tipp haben wir erhalten, dass wir unsere Funktion:

function [fib]=fibonacci(n)

auf

function [fib, zaehler]=fibonacci(n,zaehler)

erweitern.

Und das ist mein Problem:
Was soll ich denn für die Variable zaehler am Anfang einsetzen?
Und wie summiert mir Matlab die Aufrufe so auf, dass ich am Ende unter dem Rückgabewert zaehler die entspr. Zahl erhalte?

Habe folgendes bisher erreicht:

function [fib]=fibonacci(n)

zaehler=0;

if n==0
fib=0;
elseif n==1
fib=1;
else
fib=fibonacci(n-1)+fibonacci(n-2);
zaehler=zaehler+1;
end
disp(['Anzahl der eigenen Aufrufe: ' num2str(zaehler)])

end


Das ergibt:
>> fibonacci(5)
Anzahl der eigenen Aufrufe: 0
Anzahl der eigenen Aufrufe: 0
Anzahl der eigenen Aufrufe: 1
Anzahl der eigenen Aufrufe: 0
Anzahl der eigenen Aufrufe: 1
Anzahl der eigenen Aufrufe: 0
Anzahl der eigenen Aufrufe: 0
Anzahl der eigenen Aufrufe: 1
Anzahl der eigenen Aufrufe: 1
Anzahl der eigenen Aufrufe: 0
Anzahl der eigenen Aufrufe: 0
Anzahl der eigenen Aufrufe: 1
Anzahl der eigenen Aufrufe: 0
Anzahl der eigenen Aufrufe: 1
Anzahl der eigenen Aufrufe: 1

ans =

5


Wenn ich die Einsen zus.zähle, komme ich auf 7, das müsste passen laut meiner eigenen Überlegung.

Wie summiere ich nun diese Einsen auf?
zaehler in Rückgabewert und Variable oben "einzuspeisen" wird iwie nicht akzeptiert...


DANKE für euer Hilfe, es ist wirklich dringend!
Private Nachricht senden Benutzer-Profile anzeigen


MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 11.05.2012, 09:10     Titel:
  Antworten mit Zitat      
Hallo,

zaehler=0 muss natürlich einmalig außerhalb der Funktion erfolgen.

Grüße, MaFam
Private Nachricht senden Benutzer-Profile anzeigen
 
latingirl
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 11.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2012, 09:21     Titel:
  Antworten mit Zitat      
Toll, das hier so schnell geantwortet wird *großes Lob*

Also zu deinem Vorschlag:
Ich speichere ja meine Funktion in einer fibonacci.m-Datei ab.

Wenn ich zaehler=0 aus dieser Datei lösche, wird zaehler in der Datei rot unterringelt.

Wenn ich im Command Window zaehler=0 und fibonacci(5) aufrufe, dann gibt er mir trotzdem nix neues aus.

Oder verstehe ich dich falsch? Könntest du noch etwas konkreter werden?
Danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 11.05.2012, 09:22     Titel:
  Antworten mit Zitat      
Du musst auch deinen neuen Funktionskopf verwenden: function [fib, zaehler]=fibonacci(n,zaehler)
Wie sollte das auch sonst funktionieren=? Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
latingirl
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 11.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2012, 09:25     Titel:
  Antworten mit Zitat      
Ok, Folgendes hab' ich eingegeben:

function [fib,zaehler]=fibonacci(n,zaehler)
zaehler=0;
if n==0
fib=0;
elseif n==1
fib=1;
else
fib=fibonacci(n-1,zaehler)+fibonacci(n-2,zaehler);
zaehler=zaehler+1;
end
disp(['Anzahl der eigenen Aufrufe: ' num2str(zaehler)])

end

Das zaehler in Fettschrift wurde rot unterringelt.


Im Command-Window kam Folgendes:
>> fibonacci(5,0)
Anzahl der eigenen Aufrufe: 0
Anzahl der eigenen Aufrufe: 0
Anzahl der eigenen Aufrufe: 1
Anzahl der eigenen Aufrufe: 0
Anzahl der eigenen Aufrufe: 1
Anzahl der eigenen Aufrufe: 0
Anzahl der eigenen Aufrufe: 0
Anzahl der eigenen Aufrufe: 1
Anzahl der eigenen Aufrufe: 1
Anzahl der eigenen Aufrufe: 0
Anzahl der eigenen Aufrufe: 0
Anzahl der eigenen Aufrufe: 1
Anzahl der eigenen Aufrufe: 0
Anzahl der eigenen Aufrufe: 1
Anzahl der eigenen Aufrufe: 1

ans =

5


???

Zuletzt bearbeitet von latingirl am 11.05.2012, 09:27, 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: 11.05.2012, 09:27     Titel:
  Antworten mit Zitat      
Wir drehen uns im Kreis. zaehler=0 muss gestrichen werden....
Private Nachricht senden Benutzer-Profile anzeigen
 
latingirl
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 11.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2012, 09:30     Titel:
  Antworten mit Zitat      
Ok, schön, die Datei fibonacci.m scheint jetzt fehlerfrei zu sein und es leuchtet mir auch ein, dass ich zaehler=0 rauslassen muss:

function [fib,zaehler]=fibonacci(n,zaehler)

if n==0
fib=0;
elseif n==1
fib=1;
else
fib=fibonacci(n-1,zaehler)+fibonacci(n-2,zaehler);
zaehler=zaehler+1;
end
disp(['Anzahl der eigenen Aufrufe: ' num2str(zaehler)])

end


Dann kann ich ja stattdessen im Command-Window für die Variable zaehler 0 einsetzen, trotzdem ändert sich für fibonacci(5,0) nix, es wird nix summiert Sad
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 11.05.2012, 09:53     Titel:
  Antworten mit Zitat      
Hm, ich denke, du machst das besser mit einer globalen Variable für zaehler.
Private Nachricht senden Benutzer-Profile anzeigen
 
latingirl
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 11.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2012, 09:59     Titel:
  Antworten mit Zitat      
Wie gesagt, ich habe ja den obigen Link mir schon einmal angeschaut.
Aber der Hinweis mit function [fib, zaehler] = fibonacci(n, zaehler) wird ja nicht ohne Grund gegeben sein.
Ansonsten wäre sicherlich auf dem Übungsblatt gestanden:
Hinweis: globale Variable

Ergo: Ich denke nicht, dass wir mit globalen Variablen arbeiten dürfen.

Aber dann muss es wirklich sehr schwer sein, wenn dir auch nix dazu einfällt - denn du bist ja denke ich schon sehr fit in matlab was ich so an der Beteiligung hier im Forum sehe Smile

Ich grübel' noch ein wenig...
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 11.05.2012, 10:04     Titel:
  Antworten mit Zitat      
Call by reference funktioniert in Matlab glaube ich nicht, aber versuche mal die Zeile:

Code:
Private Nachricht senden Benutzer-Profile anzeigen
 
latingirl
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 11.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2012, 10:11     Titel:
  Antworten mit Zitat      
Darauf reagiert matlab so ähnlich wie auf global zaehler:

(fett heißt wieder unterringelt)

function [fib,zaehler]=fibonacci(n,zaehler)
persistent zaehler;
if n==0
fib=0;
elseif n==1
fib=1;
else
fib=fibonacci(n-1,zaehler)+fibonacci(n-2,zaehler);
zaehler=zaehler+1;
end
disp(['Anzahl der eigenen Aufrufe: ' num2str(zaehler)])

end

-> Fehlermeldung im Command Window:
The PERSISTENT declaration must precede any use of the variable zaehler.


Vor function darf ich persistent zaehler nicht stellen und nur im Command Window (also nicht in der m-Datei) bringt's mir ja auch nix.

Hmmm... Ein Versuch war's wert!

P.S.: tic und toc helfen mir auch nicht weiter, oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 11.05.2012, 10:43     Titel:
  Antworten mit Zitat      
So funktioniert es:

Code:

function [fib,zaehler]=fibonacci(n,zaehler)
   zaehler=zaehler+1;
   disp(['Anzahl der eigenen Aufrufe: ' num2str(zaehler)])
   if n==0
      fib=0;
      return;
   elseif n==1
      fib=1;
      return;
   else
      [a,zaehler]=fibonacci(n-1,zaehler);
      [b,zaehler]=fibonacci(n-2,zaehler);
      fib=a+b;
   end
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
latingirl
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 11.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2012, 10:56     Titel:
  Antworten mit Zitat      
Ok, dass klingt logisch, vielen vielen DANK...
Da wär' ich niiiieeee allein draufgekommen.

Es ergeben sich ja 15 Aufrufe, d.h. das System zählt es auch als Aufruf, wenn es die Startwerte F_0=0 und F_1=1 verwendet.

Okidoki!
Danke nochmals.
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 11.05.2012, 11:03     Titel:
  Antworten mit Zitat      
Ich schätze übrigens, dass sich die Anzahl der Schritte asymptotisch g^(n+1) annähert, wobei g der goldene Schnitt ist, also ungefähr g=1.618.
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.