DMUG-Archiv 2005

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: iteration (und Goto)

Hallo,

1980 habe ich in meinem Ingenieurstudium mit Pascal begonnen, da gab es auch Goto, aber das war streng verboten und das ist richtig so. Natürlich muss ich in Assembler Sprünge programmieren können, aber MMA hat wohl andere Eigenheiten (@@ /@ etc.), die geeigneter sind hier erwähnt zu werden. Ein Computer ist eine Maschine, mit der man alle anderen Maschinen simulieren kann, also auch eine Basicmaschine. MMA ist natürlich bestens geeignet, sich in diese Simulationsmaschinen einzureihen, das hat Herr Mäder mit der Prologmaschine gezeigt. Aber Goto und Label ist nach meiner Meinung doch ein sehr fragwürdiges Konstrukt. Tatsächlich wurde Goto mit dem Beitrag von Herrn Sperber in diesem Forum zum ersten mal erwähnt! Wahrscheinlich kommt man also sehr gut ohne aus....

Zum Aufräumen eignet sich vielleicht Return[AufräumenTeil1; AufräumenTeil2] besser.

Sonst hat Jens-Peer fast immer Recht.

Gruß

Peter

Jens-Peer Kuska wrote:

Hallo,

Peter hat
a) recht das es schon schön wäre t einen numerischen
  Wert zuzuweisen.

z. B. sollte
Subdivide[lst_] := Drop[
Flatten[
Transpose[{lst, Append[0.5*Plus @@@ Partition[lst, 2, 1], 1]}]], -1]

Subdivide[lst_, n_] := Nest[Subdivide, lst, n]

y = {0, 1}; Label[begin]; y = Subdivide[y]; If[y[[2]] > 0.01, Goto[begin], y]

recht gut funktionieren.

b) unrecht wenn er etwas gegen Goto[] hat. Goto[] kann eine Funktion sogar übersichtlicher und weniger fehleranfällig machen. Das klassische Beispiel dafür ist das Abbrechen einer Funktion, die erst einmal allerhand Dinge initialisiert die beim Ende der Funktion wieder aufgeräumt werden sollen also z. B

SomeFunction[x_]:=Module[{y},

y=x;

a=Table[y^2,{Length[y]}];

b=Sqrt[y];

If[y[[1]]>2,Goto[exit]];

If[a[[3]]>4,Goto[exit]];

If[b[[4]]>5,Goto[exit]];

Label[exit];

a={}; b={};

]

Natürlich kann man auch jedes mal

SomeFunction[x_]:=Module[{y},

y=x;

a=Table[y^2,{Length[y]}];

b=Sqrt[y];

If[y[[1]]>2,a={}; b={};Return[]];

If[a[[3]]>4,a={}; b={};Return[]];

If[b[[4]]>5,a={}; b={};Return[]];

a={}; b={};

]

schreiben aber das ist sicher nicht die beste Lösung. Ähnlich wäre es, wenn man die eine Datei schreibt, die (egal was passiert) am Ende geschlossen werden muß. Natürlich kann man auch hier auch eine lokale Funktion machen, aber eigentlich ist an einem solchen Goto[] nichts auszusetzen.

... und eigentlich erwarte ich, das Goto's noch an deutschen Hochschulen gelehrt werden. Zum einen, weil die meisten Maschinensprachen ein Goto brauchen -- und Assembler sollte ein Informatiker schon können, wenigstens ein bischen. Zum anderen, weil es Millionen von Zeilen FORTRAN Code gibt den keiner neu schreiben will, der immer noch benutzt wird und den man auch lesen können sollte. Kann es schöneres geben als ein Berechnetes GOTO ? eigentlich nicht -- oder ?

... und ich nehme Mathematica auch gern um einen Algorithmus auszuprobieren, den ich dann in einem C-Programm oder FORTRAN Programm brauche. In so einem Fall werde ich keine Map[]s, Apply[]s oder sonst was benutzen, sonder ordentliche For[], Do[] oder auch Goto[]s. Damit beim Übertragen in C oder FROTRAN nicht so viel schief gehen kann.

Gruß

 Jens








----- Original Message ----- From: "klamser" <klamser@XXXXXXX.de>
To: "Christian M. Sperber" <sperber.christian@XXXXXXX.de>
Cc: <demug@XXXXXXX.ch>
Sent: Sunday, April 24, 2005 11:58 PM
Subject: Re: iteration


Hallo Herr Sperber ,

au weia, eine wirklich vollständige Implementation einer Programmiersprache kennt auch Label und Goto. Sogar seit der Version 1 (sagt zumindest das Hilfesystem).

Also: Das Problem hier ist, dass y3=t gesetzt werden soll, t aber nicht bekannt ist. Also sollte man vorher t einen Wert zuweisen. Und dazwischen erneut, sonst läuft das ewig..... Das geht übrigens in Basic genau so.

Also zum Zweiten: Man kann sich natürlich in die Analen von Mathematica.ch eintragen, indem wie vor 30 Jahren programmiert wird und Label und Goto nutzt. Ich weiß nicht, wo einem so etwas heute noch beigebracht wird, ich hoffe nur, dass so etwas nicht an einer deutschen Hochschule passiert (wahrscheinlich ist das dann keine Eliteuni). Da nicht zu erkennen ist, was der Algorithmus erreichen soll, mach es wenig Sinn diesen hier zu verbessern, denn irgendwann müsste ja t ein Wert zugewiesen werden. Ich kann nicht erraten welcher, aber es geht garantiert ohne Goto und Label viel besser.

Wahrscheinlich sollte der Algorithmus besser in ein Modul eingebaut werden. Näheres hierzu ist im Hilfesystem von MMA zu finden.

Schöner Gruß

Peter Klamser

Christian M. Sperber wrote:

ich versuche in einer Label[beginn];.......;If[test,Goto[begin]] Schleife. einen Wert gegen den in der naechsten Runde berechneten zu vergleichen. Ich bekomme es aber nicht hin diesen zu definieren. Mathematica akzeptiert das nicht. Damit es klarer wird habe ich ein notebook angehaengt. In der ersten Berechnung laeuft die Anzahl der Durchgaenge ueber eine Variable q. In der zweiten Berechung habe ich es einfach so aufgeschrieben wie ich es gerne haette funktioniert aber nicht.









Antworten:
Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html