Ваш запрос кажется немного противоречивым: когда случайный выбор выбирает 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}
person
Chris Degnen
schedule
29.07.2014