Wolfram言語,ランダム選択再帰
-
20-12-2019 - |
質問
a = RandomChoice[{a,2}]&
a[]
この例を実現するには他の方法もありますが、私はこの方法を使用して、これと同様のより複雑な処理を実行したいと考えています。
なくなるまで続けてもらえますか? a
解決しようとしてスタック オーバーフローが発生することなく、解決が残されています。 {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
に使える。ここでも再帰が起こっていますが、 While
番号が選択されるとプロセスが続行されます。
While[MemberQ[heldlist, Hold[_Symbol]], a]
ちなみに、選択は Hold[a] でした
参考までに、選択は Hold[1] でした
ちなみに、選択は Hold[a] でした
これらはリストの残りの項目です:-
ReleaseHold /@ heldlist
{1, 2, 1, 3, 1, 4, 5}