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 aqueda 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.

¿Fue útil?

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 aQueda.

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}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top