Wolfram Language, RandomChoice-Rekursion
-
20-12-2019 - |
Frage
a = RandomChoice[{a,2}]&
a[]
Es gibt andere Möglichkeiten, dieses Beispiel zu erreichen, aber ich möchte mit dieser Methode kompliziertere Dinge wie diese tun.
Kann ich das so lange fortsetzen, bis es keine mehr gibt? a
Es muss noch aufgelöst werden, ohne dass beim Versuch, es aufzulösen, ein Stapelüberlauf entsteht {a,2}
bevor Sie die Wahl treffen?Treffen Sie stattdessen die Wahl und lösen Sie nur das ausgewählte Symbol auf.
Lösung
Hier ist eine Möglichkeit, etwas zu haben RandomChoice
Eine Funktion nur auswerten, wenn sie ausgewählt ist:
g := (Print["evaluate g"]; 42);
f = ( If[TrueQ[#], g, #] &@RandomChoice[{True, 1, 2, 3, 4}]) &
Table[f[], {10}]
Dies gibt „evaluate g“ nur bei zufälliger Auswahl aus und gibt z. B. aus.
(* {2, 42, 3, 1, 3, 2, 4, 42, 2, 4} *)
Dies ist ein anderer Weg, vielleicht etwas sauberer:
f = Unevaluated[{g, 1, 2, 3, 4}][[RandomInteger[{1, 5}]]] &
Das funktioniert rekursiv gut:
a = Unevaluated[{a[], 2}][[RandomInteger[{1, 2}]]] &
Allerdings gibt es, wie ich im Kommentar sagte, jedes Mal einfach 2 zurück, da es so lange rekursiv ist, bis 2 ausgewählt wird.
a[] (* 2 *)
Ich verstehe die Gesamtheit der Frage nicht und vermute, dass es einen besseren Weg gibt, das zu erreichen, was Sie wollen.
Andere Tipps
Ihre Anfrage scheint etwas widersprüchlich zu sein:wenn die Zufallsauswahl auswählt a
Sie möchten, dass es rekursiv ist, aber wenn es eine Zahl auswählt, möchten Sie trotzdem fortfahren, bis keine mehr vorhanden sind a
ist übrig.
Der folgende Code erledigt dies, die Rekursion ist jedoch technisch unnötig.Vielleicht trifft es auf Ihre Bewerbung zu.
Der erste Teil zeigt, wie Sie Auswahlen von rekursiv durchführen können a
durch die Nutzung Hold
:-
Clear[a]
list = {1, 2, a, 1, a, 3, a, 1, 4, 5};
heldlist = Hold /@ list;
a := Module[{z}, z = RandomChoice[heldlist];
Print["for information, choice was ", z];
If[MatchQ[z, Hold[_Symbol]],
heldlist = DeleteCases[heldlist, z, 1, 1];
If[MemberQ[heldlist, Hold[_Symbol]], ReleaseHold[z]]]]
a
Bei dieser Gelegenheit rufe ich an a
rekursiert einmal, wählt dann eine 4 und stoppt wie erwartet.
Zur Information, die Auswahl war Halten[a]
Zur Information, die Auswahl war „Halten“[4]
Um den Prozess so lange fortzusetzen, bis keine mehr vorhanden sind a
'S While
kann verwendet werden.Aber auch hier findet eine Rekursion statt While
hält den Prozess am Laufen, wenn eine Nummer ausgewählt wird.
While[MemberQ[heldlist, Hold[_Symbol]], a]
Zur Information, die Auswahl war Halten[a]
Zur Information, die Auswahl war „Halten“[1]
Zur Information, die Auswahl war Halten[a]
Dies sind die verbleibenden Elemente in der Liste: –
ReleaseHold /@ heldlist
{1, 2, 1, 3, 1, 4, 5}