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 *)