문제

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}]

이것은 무작위로 선택된 경우에만 "evaluate 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]였습니다.

정보를 위해 선택은 보류였습니다.[4]

더 이상 없을 때까지 프로세스를 계속하려면 a'에스 While 사용할 수 있습니다.여기서도 재귀가 발생하지만 While 숫자가 선택되면 프로세스가 계속 진행됩니다.

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

정보를 위해 선택은 Hold[a]였습니다.

정보를 보려면 보류를 선택했습니다.[1]

정보를 위해 선택은 Hold[a]였습니다.

목록의 나머지 항목은 다음과 같습니다.

ReleaseHold /@ heldlist

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top