DMUG-Archiv 2012

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

Re: Selectionort aus Mathematica Dokumentation

Hallo Patrick

Es liegt daran, dass Mathematica bei einer Funktionsdefinition
der Art f[x_]:=... call-by-value benutzt. Dass heisst der Parameter, den
du uebergibst wird nicht als Symbol/Variable uebergeben, sondern nur
dessen Wert.

sinnvollerweise, denn es könnte ja einer folgendes eingeben:

In[13]:= selectionSort[RandomInteger[1000, max]]
Out[13]= {28, 153, 163, 247, 286, 288, 319, 354, 387, 388, 536, 565, \
654, 685, 777, 855, 889, 928, 980, 984}

Der direkte Ausweg ist entweder sich mit Attributen von Funktionen
(HoldFirst, etc) vertraut zu machen,

hmm ...

In[19]:= Remove[max, liste]
max = 20;
liste = RandomInteger[ 1000, max]

Out[21]= {161, 820, 625, 821, 59, 780, 789, 650, 764, 974, 288, 634, \
772, 162, 802, 233, 960, 553, 589, 727}

In[14]:= Remove[selectionSortHF]
SetAttributes[selectionSortHF, HoldFirst];
(* wenn das Attribute HoldFirst gesetzt wird, darf das Argument von
selectionSortHF[] kein HeadPattern haben. *)
selectionSortHF[ liste_(* List *)] :=
 Module[{i, j, limit = Length[liste]},
  Do[If[ liste[[i]] > liste[[j]],
    liste[[{i, j}]] = liste[[{j, i}]]], {i, limit - 1}, {j, i + 1,
    limit}];
  liste]

In[22]:= selectionSortHF[ liste]
Out[22]= {59, 161, 162, 233, 288, 553, 589, 625, 634, 650, 727, 764, \
772, 780, 789, 802, 820, 821, 960, 974}

okay, jedoch

In[23]:= selectionSortFalsch[RandomInteger[1000, max]]
During evaluation of In[23]:= Set::setps: RandomInteger[1000,max] in the part assignment is not a symbol. >> During evaluation of In[23]:= Set::setps: RandomInteger[1000,max] in the part assignment is not a symbol. >> During evaluation of In[23]:= Set::setps: RandomInteger[1000,max] in the part assignment is not a symbol. >> During evaluation of In[23]:= General::stop: Further output of Set::setps will be suppressed during this calculation. >>

Out[23]= {61, 446, 741, 692, 2, 122, 904, 909, 125, 196, 730, 79, \
655, 933, 158, 552, 950, 482, 855, 932}

funktioniert nicht, das Ergebnis ist nicht sortiert; liste ist noch ein Symbol (das bloss ohne HoldFirst nicht im Module sichtbar wird), RandomInteger[1000, max] ist "nur" eine Expression, die mehrmals evaluiert wird.

Gruss
Udo.

oder die Eingabeliste einer lokalen
Variablen zuzuweisen:

Ja.



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

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