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? aEs 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.

War es hilfreich?

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 aist ü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}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top