a = RandomChoice[{a,2}]&
a[]
还有其他方法可以实现此示例,但我希望使用此方法执行与此类似的更复杂的事情。
我可以让这个继续下去,直到没有a
s 可以解决,而不会通过在做出选择之前尝试解决而产生堆栈溢出{a,2}
?而是做出选择并仅解析选择的符号。
a = RandomChoice[{a,2}]&
a[]
还有其他方法可以实现此示例,但我希望使用此方法执行与此类似的更复杂的事情。
我可以让这个继续下去,直到没有a
s 可以解决,而不会通过在做出选择之前尝试解决而产生堆栈溢出{a,2}
?而是做出选择并仅解析选择的符号。
这是一种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 *)
我不明白这个问题的全部内容,我的猜测是有更好的方法来完成你想要的。
您的请求似乎有些矛盾:当随机选择选择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 While
keeps 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}