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

还有其他方法可以实现此示例,但我希望使用此方法执行与此类似的更复杂的事情。

我可以让这个继续下去,直到没有as 可以解决,而不会通过在做出选择之前尝试解决而产生堆栈溢出{a,2}?而是做出选择并仅解析选择的符号。

4

2 回答 2

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

我不明白这个问题的全部内容,我的猜测是有更好的方法来完成你想要的。

于 2014-07-29T20:53:15.787 回答
0

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

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

第一部分展示了如何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可以使用。There is recursion going on here too but Whilekeeps the process going when a number is picked.

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

有关信息,选择是 Hold[a]

有关信息,选择是 Hold[1]

有关信息,选择是 Hold[a]

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

ReleaseHold /@ heldlist

{1、2、1、3、1、4、5}

于 2014-07-29T13:58:51.637 回答