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.