Wolfram Language, recursividad RandomChoice
-
20-12-2019 - |
Pregunta
a = RandomChoice[{a,2}]&
a[]
Hay otras formas de lograr este ejemplo, pero deseo hacer cosas más complicadas similares a esta usando este método.
¿Puedo hacer que esto continúe hasta que no haya más a
queda por resolver, sin producir un desbordamiento de pila al intentar resolver {a,2}
antes de hacer la elección?En lugar de hacer la elección y resolver sólo el símbolo elegido.
Solución
Aquí tienes una manera de tener RandomChoice
evaluar una función sólo cuando se selecciona:
g := (Print["evaluate g"]; 42);
f = ( If[TrueQ[#], g, #] &@RandomChoice[{True, 1, 2, 3, 4}]) &
Table[f[], {10}]
esto imprime "evaluar g" justo cuando se selecciona aleatoriamente y genera, por ejemplo.
(* {2, 42, 3, 1, 3, 2, 4, 42, 2, 4} *)
Esta es otra forma, quizás un poco más limpia:
f = Unevaluated[{g, 1, 2, 3, 4}][[RandomInteger[{1, 5}]]] &
esto funciona bien de forma recursiva:
a = Unevaluated[{a[], 2}][[RandomInteger[{1, 2}]]] &
Aunque, como dije en el comentario, simplemente devuelve 2 cada vez, ya que se repite hasta que se elige 2.
a[] (* 2 *)
No entiendo la pregunta completa y supongo que hay una mejor manera de lograr lo que deseas.
Otros consejos
Su solicitud parece un poco contradictoria:cuando la elección aleatoria selecciona a
desea que se repita, pero si elige un número, aún desea continuar hasta que no haya más a
Queda.
El siguiente código hace esto, pero la recursividad es técnicamente innecesaria.Quizás en su aplicación sea aplicable.
La primera parte muestra cómo puede recurrir a selecciones de a
mediante el uso 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
En esta ocasión llamando a
se repite una vez, luego elige un 4 y se detiene, como se esperaba.
para obtener información, la opción fue Hold[a]
para obtener información, la opción fue Mantener[4]
Para hacer que el proceso continúe hasta que no queden a
's While
puede ser usado.Aquí también hay recursividad, pero While
mantiene el proceso en marcha cuando se elige un número.
While[MemberQ[heldlist, Hold[_Symbol]], a]
para obtener información, la opción fue Hold[a]
para obtener información, la opción fue Mantener[1]
para obtener información, la opción fue Hold[a]
Estos son los elementos restantes en la lista: -
ReleaseHold /@ heldlist
{1, 2, 1, 3, 1, 4, 5}