a = RandomChoice[{a,2}]&
a[]
还有其他方法可以实现这个例子,但我希望使用这种方法做更复杂的事情。
我是否可以继续此操作,直到没有a
可以解决,在做出选择之前尝试解析{a,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}