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

Rekursive Programmieren

 

Senzenberger
Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 07.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2013, 22:58     Titel: Rekursive Programmieren
  Antworten mit Zitat      
Hi, es geht darum Quadratzahlen zu programmieren bis zu 50. Das heißt die Quadratzahl größer 50 darf nicht mehr ausgeben werden. Folgender Code funktioniert aber es ist eine If-Abfrage innerhalb der Schleife=>das ist nicht gut bezüglich Programm Geschwindigkeit. Diese spielt bei mir keine Rolle.
Code:
function y=quadratzahl()

n=1;
schleifenbedingung=true;
while(schleifenbedingung)
    y=n*n;
    n=n+1;
    if(n*n>50)
        schleifenbedingung=false;
    end
end


Kollege sprach rekursive Programmierung an. Im folgenden Code habe ich es versucht aber ich setze mir n und y immer wieder auf null.
Code:
function y=quadratzahl()

n=0;
y=0;
if(y>50)
    fprint('Qudratzahl d%',y)
else
   
     n=n+1;
     y=n*n;
     quadratzahl()
end


danke.bis bald
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.09.2013, 02:57     Titel: Re: Rekursive Programmieren
  Antworten mit Zitat      
Hallo Senzenberger,

Hast Du eine Frage?

Wie wäre dies:
Code:
s = (1:floor(sqrt(50))) .^2

Gruß, Jan

[EDITED, fehlende Klammer eingefügt]

Zuletzt bearbeitet von Jan S am 22.09.2013, 20:41, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Senzenberger
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 07.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2013, 09:43     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für die rasche un erstaunliche kurze Antwort. Ich bekomme aber die Fehlermeldung"Operator '.^' s seldom used in this context". Was mach ich da noch falsch, den deine Lösung wäre mir lieber weil ich gestern noch auf folgende Lösung gekommen wäre.
Code:
function s=quadratzahl()

persistent y;
persistent n;


if(isempty(y))
y=0;
end

if(isempty(n))
n=0;
end

n=n+1;
if(n*n<50)
    y=n*n;
    quadratzahl();
else
    fprintf('Qudratzahl %d\n',y)
   
end


bis bald
Senzi
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2013, 10:24     Titel:
  Antworten mit Zitat      
Hallo Senzenberger,
Hausaufgaben zu lösen, ohne zu wissen, welches Vorwissen der Fragende haben sollte, ist sehr schwierig. Wie Du auf »persistent« gekommen bist, will ich am Besten gar nicht wissen, es sollte aber an der Stelle nur so von Warnhinweisen gewimmelt haben: »Nur verwenden, wenn man auch ganz genau weiß was man tut«, »nur für sehr erfahrene Programmierer«, »tu's nicht!«.
Also vergiss erst mal dass es »persistent« überhaupt gibt. Alle Variablen in Funktionen sind »lokal«, das heißt, sie haben keinen Wert, wenn die Funktion startet, und vergessen ihren Wert wieder, wenn die Funktion fertig ist.
Alle Werte die eine Funktion von außen braucht, werden über ihre Parameter übergeben, alle Werte, die die Funktion zurückgibt, werden über ihre Rückgabeparameter zurückgegeben.
Code:
function liste = quadrat(liste, n)
    neu = n*n;
    if neu<50
        liste = quadrat([liste neu], n+1)
    end
end


Code:
quadrat([], 1)
Private Nachricht senden Benutzer-Profile anzeigen
 
Senzenberger
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 07.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2013, 11:15     Titel:
  Antworten mit Zitat      
hallo Sirius3

danke so funktioniert es sehr gut. Ich arbeite mich gerade durch ein Buch und das war eine Aufgabe. Also hast du recht mit der Hausaugaben. Den Gefahren bei der Verwendung von persistent war ich mir nicht bewusst aber ich wurde skeptisch als ich die Variablen vor jeden Druchlauf mit clear all löschen musste(persistent gefunden in einem Forum).
Ich wollte die Funktion so schreiben das man keine Eingabe Parameter benötigt.

Senzi
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 22.09.2013, 15:40     Titel:
  Antworten mit Zitat      
Zitat:
ch wollte die Funktion so schreiben das man keine Eingabe Parameter benötigt
eine rekursive funktion zu schrieben die quasi nicht weis was sie vorher schon gemacht hat ist glaube ich nicht sinnvoll umzusetzen.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.09.2013, 21:15     Titel:
  Antworten mit Zitat      
Hallo Senzenberger,

Zitat:
Ich bekomme aber die Fehlermeldung"Operator '.^' s seldom used in this context"

Das ist aber eine sehr ungewöhnliche Fehlermeldung. Ich bekomme:
Zitat:
??? s = (1:floor(sqrt(50)) .^2
|
Error: Expression or statement is incorrect--possibly unbalanced (, {, or [.

Da fehlte nämlich eine schließende Klammer, also:
Code:
s = (1:floor(sqrt(50))) .^ 2

Mehr Code ist wirklich nicht nötig. Eine Rekursive Funktion dafür zu verwenden und statt eines Inputs persistent Variablen zu nitzen ist wirklich schräg. Klar, machen kann man das. Aber der künstlich erzeuigte Komplexität steht in keiner Relation zur Einfachheit der Fragestellung.

Überlicherweise werden solche Aufgaben mit einer WHILE-Schleife gelöst, genau wie Du es in Deinem ersten Post gezeigt hast. Die Behauptung, dass IF-Blöcke in der Schleife ein Problem für die Geshwindigkeit sind, ist nicht stichhaltig. Die Laufzeit für das Programm beträgt auf meiner betagten Core2Duo 2.3GHz Maschine 0.00000208 Sekunden. Da der Inhalt des Bildschirms nur mit 60Hz dargestellt wird, also einmal pro 0.01667 Sekunden, ist die Laufzeit hier vollkommen unerheblich.

Der Versuch die Funktion rekursiv mit versteckter Parameter-Übergabe in persistenten Variablen zu schreiben wird dagegen millionenfach mehr Zeit benötigen, als die Laufzeit benötigt.

Gruß, Jan
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.