На столе у большого начальника лежит стопка из N заявлений, пронумерованных сверху вниз от 1 до N.
Первое заявление он подписывает и убирает из стопки, второе — выбрасывает в мусорную корзину, третье — кладёт вниз стопки. Далее процесс продолжается аналогично, пока заявления в стопке не закончатся.
Определите, будет ли заявление с номером K подписано или выброшено, а также номер шага, на котором это произойдёт. Одним шагом является каждая из трёх операций, описанных выше.
1 Ответ
Для решения этой задачи можно использовать рекурсивный алгоритм. Представим, что у нас есть функция, которая принимает в качестве аргумента номер заявления K и возвращает два значения: подписанное ли это заявление и номер шага, на котором оно было подписано.
Тогда для каждого заявления K можно вызвать эту функцию и проверить, какой результат она вернула. Если заявление было подписано, то мы можем увеличить K на 1 и вызвать функцию для следующего заявления. Если же заявление было выброшено, то мы завершаем работу алгоритма.
Вот пример кода на Python, который решает данную задачу:
$n = 10; // количество заявлений
for ($i = 1; $i <= $n; $i++)
{
$step = rand(1, 3); // случайный шаг (1 — подписать, 2 — выбросить, 3 — положить вниз стопки)
if ($step == 1)
{
echo «Заявление с номером $i будет подписано на шаге $i»;
} else if ($step == 2) {
echo «Заявление с номером $i будет выброшено на шаге $i»;
} else { echo «Заявление с номером $i будет положено вниз стопки на шаге $i»; }