Wolfram mathematica Wolfram语言,随机选择递归

Wolfram mathematica Wolfram语言,随机选择递归,wolfram-mathematica,wolfram-language,Wolfram Mathematica,Wolfram Language,还有其他方法可以实现这个例子,但是我希望使用这个方法做更复杂的事情 我是否可以继续执行此操作,直到没有剩余的as要解析,而在做出选择之前,通过尝试解析{a,2}不会产生堆栈溢出?取而代之的是做出选择并只解析所选的符号。您的请求似乎有点矛盾:当随机选择选择了a时,您希望它递归,但如果它选择了一个数字,您仍然希望继续,直到没有a 下面的代码可以做到这一点,但递归在技术上是不必要的。也许在您的应用程序中它将是适用的 第一部分显示了如何通过使用Hold递归选择a:- a = RandomChoice[{

还有其他方法可以实现这个例子,但是我希望使用这个方法做更复杂的事情


我是否可以继续执行此操作,直到没有剩余的
a
s要解析,而在做出选择之前,通过尝试解析
{a,2}
不会产生堆栈溢出?取而代之的是做出选择并只解析所选的符号。

您的请求似乎有点矛盾:当随机选择选择了
a
时,您希望它递归,但如果它选择了一个数字,您仍然希望继续,直到没有
a

下面的代码可以做到这一点,但递归在技术上是不必要的。也许在您的应用程序中它将是适用的

第一部分显示了如何通过使用
Hold
递归选择
a
:-

a = RandomChoice[{a,2}]&
a[]
在这种情况下,调用
a
会递归一次,然后选择一个4并按预期停止

关于信息,选择被搁置[a]

关于信息,选择被搁置[4]

使过程继续,直到没有
a
,而可以使用
。这里也有递归,但是
While
会在拾取数字时保持该过程

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
关于信息,选择被搁置[a]

关于信息,选择被搁置[1]

关于信息,选择被搁置[a]

以下是列表中的其余项目:-

While[MemberQ[heldlist, Hold[_Symbol]], a]
{1,2,1,3,1,4,5}


以下是一种让
RandomChoice
仅在选中时评估函数的方法:

ReleaseHold /@ heldlist
这将在随机选择时打印“评估g”,并输出eg

 g := (Print["evaluate g"]; 42);
 f = ( If[TrueQ[#], g, #] &@RandomChoice[{True, 1, 2, 3, 4}]) &
 Table[f[], {10}]
这是另一种方式,可能更干净一点:

 (* {2, 42, 3, 1, 3, 2, 4, 42, 2, 4} *)
这可以很好地递归工作:

 f = Unevaluated[{g, 1, 2, 3, 4}][[RandomInteger[{1, 5}]]] &
虽然正如我在评论中所说的,它只是每次返回2,因为它会递归,直到选择2为止

 a = Unevaluated[{a[], 2}][[RandomInteger[{1, 2}]]] &

我不理解问题的全部,我猜有更好的方法来实现你的目标。

你说没有a的问题需要解决是什么意思?这看起来应该保持,直到它随机选择2为止。
 a[] (* 2 *)