Wolfram语言,RandomChoice递归

时间:2014-07-28 22:47:54

标签: wolfram-mathematica wolfram-language

a = RandomChoice[{a,2}]&
a[]

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

我是否可以继续此操作,直到没有a可以解决,在做出选择之前尝试解析{a,2}而不会产生堆栈溢出?而是选择并仅解析所选择的符号。

2 个答案:

答案 0 :(得分:1)

以下是仅在选择时RandomChoice评估函数的方法:

 g := (Print["evaluate g"]; 42);
 f = ( If[TrueQ[#], g, #] &@RandomChoice[{True, 1, 2, 3, 4}]) &
 Table[f[], {10}]

这打印"评估g"就在随机选择并输出例如

 (* {2, 42, 3, 1, 3, 2, 4, 42, 2, 4} *)

这是另一种方式,可能更清洁一点:

 f = Unevaluated[{g, 1, 2, 3, 4}][[RandomInteger[{1, 5}]]] &

这很好地递归:

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

虽然正如我在评论中说的那样,它每次都会返回2,因为它会被递归直到2被选中。

 a[] (* 2 *)

我不明白整个问题,我的猜测是有更好的方法来实现你想要的。

答案 1 :(得分:0)

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

以下代码执行此操作,但递归在技术上是不必要的。也许在您的申请中它将适用。

第一部分展示了如何使用a来递归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

在这种情况下,调用a一次递归,然后选择一个4并按预期停止。

  

获取信息,选择是Hold [a]

     

获取信息,选择是Hold [4]

要继续此过程,直到没有a可以使用While。这里也有递归,但While会在选择数字时保持进程。

While[MemberQ[heldlist, Hold[_Symbol]], a]
  

获取信息,选择是Hold [a]

     

获取信息,选择是Hold [1]

     

获取信息,选择是Hold [a]

这些是列表中的其余项目: -

ReleaseHold /@ heldlist
  

{1,2,1,3,1,4,5}

相关问题