DMUG-Archiv 2005

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

RE: iteration (und Goto)

hi leute,
 
also da muss ich mich selbstverständlich auch mal dazu äussern.
meine persönliche subjektive meinung: Goto[] ist in MMA absolut überflüssig und deplaziert.
mehrere Return[] (letztlich auch sprünge) sind da kaum besser und ebenfalls überflüssig nichts desto trotz gut das es 
sie der vollständigkeit halber giebt.
die wenigen fälle welche tatsächlich an übersichtlichkeit durch verwendung von Goto[] gewinnen sind mit sicherheit 
durch überlegtes programmieren zu allermindest ebenso elegant hinzukriegen.
das goto's auf maschinenebene ihre berechtigung haben ist soweit klar.
auch ich bin mit fortran gestraft, doch auch älterer fortran code verzichtet soweit er gut geschrieben ist 
weitestgehendst auf goto's
muss allerdings gestehen das ich vor allem zur fehlerbehandlung in funktionen gerne zu Abort[] das ja auch einen sprung 
dastellt greife um alle ausführung zu beenden, da gehts dann allerdings auch nirgends spaghetti code mässig weiter.
 
l.g. robert

-----Original Message-----
From: klamser [mailto:klamser@XXXXXXX.de] 
Sent: Tuesday, April 26, 2005 11:25 PM
To: Jens-Peer Kuska
Cc: Christian M. Sperber; demug@XXXXXXX.ch
Subject: 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"  <mailto:klamser@XXXXXXX.de> <klamser@XXXXXXX.de> 
To: "Christian M. Sperber"  <mailto:sperber.christian@XXXXXXX.de> <sperber.christian@XXXXXXX.de> 
Cc:  <mailto:demug@XXXXXXX.ch> <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. 










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

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