e-olymp 1206. f91

Задача

МакКарти — известный теоретик компьютерных наук. В одной из своих работ он определил рекурсивную функцию $f_{91}$, которая определена для всякого натурального числа $n$ следующим образом:

Если $n\leqslant100$, то $f_{91}\left(n\right) = f_{91}\left(f_{91}\left(n+11\right)\right)$;

Если $n\geqslant101$, то $f_{91}\left(n\right) = n-10$.

Входные данные

Натуральное число $n$, не большее $1000000$.

Выходные данные

Значение $f_{91}\left(n\right)$.

Тесты

ВХОДНЫЕ ДАННЫЕ ВЫХОДНЫЕ ДАННЫЕ
 1 5 91
 2 27 91
 3 91 91
 4 100 91
 5 102 92
 6 180 170

Код

Решение

Для решения задачи создадим функцию $f_{91}\left(n\right)$ которая в зависимости от значения $n$ будет выдавать нам разные значение, а имеено:
если $n\leqslant100$, то $f_{91}\left(n\right) = f_{91}\left(f_{91}\left(n+11\right)\right)$;
если $n\geqslant101$, то $f_{91}\left(n\right) = n-10$.
Так же, мы можем проследить законномерность того, что если $n\leqslant100$ функция $f_{91}\left(n\right)$ будет выдавть $91$, заметив это можно будет заменить сложную, но при этом красивую рекурсивную функцию на более простое и практичное решение и получить следущие соотношение:
$f_{91}\left(n\right) = \begin{cases} 91, & n\leqslant100;\\ n-10, & n\geqslant101; \end{cases}$

Ссылки

  • Условие задачи на e-olymp
  • Код на Ideone
  • Засчитанное решение на e-olymp 

3 thoughts on “e-olymp 1206. f91

    • Зачем вторая проверка? Познакомьтесь, пожалуйста, с законом исключенного третьего.
    • И условия, и решение записано неверно. Будьте внимательны. А то чепуха какая-то получается в простом условии.
    • Нельзя оформлять только один символ формулы, как формулу, а остальное обычным текстом. Предлагаю сделать так — $f_{91}\left(x\right)$.
    • В условии сказано, что МакКарти определил свою функцию рекурсивно. Но Вы-то не теоретик компьютерных наук, Вы должны подумать несколько минут и написать гораздо более простое практическое решение. Никто не требует от Вас повторения ошибок МакКарти 🙂
  1. Вы пишите «компилятор будет выдавть 91». Компилятор «выдаёт» программу в машинных кодах, а не выполняет её. Пожалуйста, посмотрите, что такое компилятор и сформулируйте какое-то менее парадоксальное утверждение.
    Когда пишите пояснение, разделяйте разработку формулы, её программирование и выполнение программы. Вы должны понимать о чем из перечисленного Вы пишите. В вашем случае, объяснения требует только разработка формулы. Остальное элементарно.

  2. Есть одно замечание, которое нужно исправить — орфографическая ошибка в слове «рекурсивную».
    Есть три замечания, которые Вам нужно прочесть и понять. Но менять в работе ничего не нужно.

    1. Лучше в функции делать только один return. В Вашем случае можно сделать так
    2. У Вас чмсла до миллиона. Зачем Вам long на этой платформе?
    3. Зачем Вам понадобилась для решения задачи функция? В условии не сказано, что нужно написать функцию. Обычно в функцию выносят участок кода, решающий обособленную задачу (так легче понимать код) и вызывающийся нсколько раз (чтобы не повторять код в разных местах). В вашем случае код понятен и проще было написать так:

    И ещё сравните, пожалуйста, 2-ю строчку первого моего кода и 5-ю второго. Почему в первом я не брал тернарную операцию в скобки, а во втором это обязательно?

Добавить комментарий