16.01 Одна функция
Готовиться с нами - ЛЕГКО!
Ошибка.
Попробуйте повторить позже
Обозначим частное от деления натурального числа на натуральное число
как
, а остаток как
.
Например,
,
. Алгоритм вычисления значения функции
, где
– целое
неотрицательное число, задан следующими соотношениями:
Укажите количество таких чисел n из интервала , для которых
Заметим, что функция на самом деле считает сумму цифр числа
Значит нужно понять для каких
сумма
цифр числа
больше суммы цифр числа
Такое возможно только в случае перехода между разрядами, то есть нам
подходят все
принадлежащие промежутку и заканчивающиеся на
Тогда нам подходит каждое десятое число, всего
в промежутке
чисел. Итого нам подходит
чисел.
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения функции , где
– целое неотрицательное число, задан следующими
соотношениями:
Укажите количество таких чисел из интервала
, для которых
не делится без
остатка на
.
Заметим, что функция находит сумму чисел от
до
Тогда мы можем найти значение функции
как
Также заметим, что значение функции
дает остаток
по модулю
только тогда, когда
дает остаток
по модулю
и дает остаток
в остальных случаях. Для поиска ответа нам нужно посчитать количество
чисел с остатком
на заданном промежутке. Тогда всего нам подходит
числа.
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения функции , где
– целое неотрицательное число, задан следующими
соотношениями:
Найдите значение
Протестируем функцию на маленьких . Получим
Оказалось, что функция
рекурсивно находит
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения функции , где
и
– целые неотрицательные числа, задан следующими
соотношениями:
, если
;
, если
и
.
Укажите количество таких целых неотрицательных чисел , для которых можно подобрать такое
, что
.
Если начать подставлять случайные и
в функцию, то станет очевидно, что
Значит нам нужно найти
количество способов разложить число
на произведение двух множителей. Тогда ответом будет количество делителей у
числа
так как для любого делителя
найдется целое неотрицательное
. Найдем все делители
с помошью
кода.
def get_divs(number): divs = [] # Список делителей # Перебираем числа до корня из number for i in range(1, int(number ** 0.5) + 1): # Если i — делитель if number % i == 0: # Добавляем i divs.append(i) # Избегаем дублирования для квадратов if i != int(number ** 0.5): # Добавляем парный делитель divs.append(number // i) return divs # Возвращаем список делителей print(len(get_divs(5555555555555)))
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения функции где
задан следующими соотношениями:
, если k - четное
, если k - нечетное
Чему равно значение функции ?
Рекурсивное решение
В задаче задан рекурсивный алгоритм, при котором функция в процессе вычислений вызывает сама себя с другими
аргументами. Для реализации создаём пользовательскую функцию в Python с помощью . Внутри функции используем
условный оператор
, чтобы задать ветвление:
;
, если k - четное;
, если k
- нечетное. Вывдем ответ через вызов функции
.
def f(n): # Базовый случай для n = 1: if n == 1: return 1 # Рекурсивный случай для чётного n if n % 2 == 0: return f(n - 1) # Рекурсивный случай для нечётного n return f(n - 1) + n print(f(10))
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения , где
— целое неотрицательное число, задан следующими соотношениями:
, при
или
при
Найдите чему равно значение
Рекурсивное решение
В задаче задан рекурсивный алгоритм, при котором функция в процессе вычислений вызывает сама себя
с другими аргументами. Для реализации создаём пользовательскую функцию в Python с помощью .
Внутри функции используем условный оператор
, чтобы задать ветвление:
, при
или
;
при
. Пропишем функцию по правилам, пройдемся циклом
, чтобы
значения ушли в кэш и для обоих значение (2023 и 2022) не было повторных лишних вычислений, и выведем
ответ.
from functools import lru_cache # Подключаем кеширование всех результатов функции @lru_cache(None) # None - количество кеширований не ограничено def F(n): # Базовый случай для n = 0, n = 1 if n == 0 or n == 1: return 1 else: # Рекурсивный случай для n > 1 return F(n - 1) * n for n in range(2500): # Перебираем значения n F(n) # Вызываем функцию, чтобы значение было посчитано и закешировано # Данные значения уже будут посчитаны в цикле и сохранены в кеш, # так что превышения глубины рекурсии не возникнет print(F(2023) // F(2022))
Динамическое решение
Для динамического решения создадим список, где каждому i-тому элементу будет соответствовать . Заполним
список по правилам из условия: введем руками значения для базовых случаев и для остальных посчитаем значения через
цикл
, получающий значения из списка. Далее выведем результат.
f = [0] * 5000 # Создаём список для хранения значений функции f(n) # Задаём известные значения для некоторых n f[0] = 1 f[1] = 1 for n in range(2, 2025): # Перебор других значений n f[n] = f[n - 1] * n # при n > 1 print(f[2023] // f[2022]) # Вывод результата
Аналитическое решение
Функция вычисляет факториал, т.е. произведение всех чисел от 1 до n.
То есть
Значит, после деления у нас останется только число 2023.
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения , где
— целые неотрицательные числа, задан следующими соотношениями:
, при
или
Найдите чему равно значение .
Рекурсивное решение
В задаче задан рекурсивный алгоритм, при котором функция в процессе вычислений вызывает сама себя
с другими аргументами. Для реализации создаём пользовательскую функцию в Python с помощью .
Внутри функции используем условный оператор
, чтобы задать ветвление:
, при
или
;
. Пропишем функцию по правилам и выведем значение через вызов функции
.
def C(n, k): # Базовый случай при k = 0, k = n if (k == 0 or k == n): return 1 # Рекурсивный случай для остальных вариантов else: return C(n - 1, k - 1) + C(n - 1, k) print(C(10, 20))
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения , где
— целое неотрицательное число, задан следующими соотношениями:
, при
или
при всех остальных
Найдите, чему равно значение данного выражения:
Решение руками
Что такое Это есть просто число
. А значит, нужно найти сумму чисел от 2 до 10000 включительно.
Решение программой
В задаче задан рекурсивный алгоритм: функция вызывает саму себя при определённых условиях. Чтобы реализовать
алгоритм программой, создадим функцию. Внутри неё задаём правила: при
и 1, иначе
. Далее обязательно запишем @lru_cache(None) перед функцией, чтобы оптимизировать программу (без
этого будет превышен лимит рекурсии). В завершении переберём числа от 2 до 10000 включительно, просуммируя
отношения
.
from functools import lru_cache # импортируем кэширование для того чтобы ускорить выполнение программы за счёт того, # что программа будет запоминать промежуточные значения функции, а не высчитывать их вновь при подсчитывании значения функции @lru_cache(None) # применяем кэширование для функции def f(n): # объявляем функцию if n == 0 or n == 1: # если n равно 0 или 1 return 1 # возвращаем 1 else: # в ином случае return f(n-1) * n sm = 0 # переменная для подсчёта суммы выражения for i in range(2,10001): sm += f(i)//f(i-1) print(sm) # вывод ответа
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения функции , где
– натуральное число, задан следующими соотношениями:
, если
, если
.
Чему равно значение выражения ?
Примечание. Факториал числа , который обозначается как
, вычисляется по формуле
.
Динамическое решение
Решим динамически: создадим массив и заполним его значениями для каждого
, чтобы не было лишних
вычислений при повторных вызовах. Далее создадим массив уже для хранения значений функции от условия — каждому
i-тому элементу соответствует
, заполним его по функции из условия в обрятном порядке (ибо при вызове
рекурсивной формулы от числа
нужны данные по элементу
). Вычислем ответ и выведем его через
.
# Создадим массив, где последовательно просчитаем # факториал от i-того элемента, берем 7000 с запасом fact = [1] * 7001 for n in range(1, 7001): # Так как идем с единицы, а по условию # n! = ... * (n - 1) * n, то при последовательном вычислении # на каждом шаге будем домножать факториал предыдущего числа на # новое число, и получится факториал нового числа fact[n] = fact[n - 1] * n # Создадим массив для хранения f[i] f = [0] * 7001 # Так как рекурсивная формула обращается к значениям числа больше его # самого, то заполняем массив по убыванию for i in range(7000, 1, -1): # База рекурсии для i >= 5000 if i >= 5000: f[i] = fact[i] else: # Рекуррентная формула для остальных числе f[i] = 2 * f[i + 1] // (i + 1) # Вычисляем ответ print(1000 * f[7] / f[4])
Решение аналитически:
Поскольку числа слишком большие, то будем решать аналитикой. Для начала вычислим значения
Замечаем, что в общем виде вычисляется как
Вычислим требуемое и получим ответ.
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения функции F(n), где n – целое число, задан следующими соотношениями
F(n) = n, если n 0,
F(n) = 5* F(n//2) + n, если 0 < n < 100 и n – чётное.
F(n) = F(n-3) + F(n-4) , если 0 < n < 100 и n – нечётное.
Определите значение выражения: F(10) + F(20) + F(15) - F(25).
Решение программой:
В задаче задан рекурсивный алгоритм: функция вызывает саму себя при определённых условиях. Чтобы реализовать
алгоритм программой, создадим функцию. Внутри неё задаём правила: при
,
при
и чётном
,
при
и нечётном
. Осталось вызывать
функцию с нужными аргументами и выполнить соответствующие операции.
def F(n): if n <= 0: # базовый случай return n if 0 < n < 100 and n % 2 == 0: # рекурсивный случай 1 return 5 * F(n // 2) + n if 0 < n < 100 and n % 2 != 0: # рекурсивный случай 2 return F(n - 3) + F(n - 4) print(F(10) + F(20) + F(15) - F(25))
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения функции , где
— целое неотрицательное число, задан следующими
соотношениями:
, при
, если
нечетно
иначе
Определите для скольких чисел из отрезка функция вернет значение True?
Если число не будет полной степенью двойки, то при последовательном делении на мы вскоре получим нечетное
число (кроме
) и вернем
,
вернут только степени двойки в данном диапазоне. Эффективно переберем
все числа-степени двойки в данном отрезке
k = 0 x = 2 while x <= 100000000: k += 1 x *= 2 print(k)
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями:
при
при чётных
при нечётных
Чему равно значение функции ?
Рекурсивное решение
В задаче задан рекурсивный алгоритм: функция вызывает саму себя при определённых условиях. Чтобы
реализовать алгоритм программой, создадим функцию. Внутри неё задаём правила: при
,
при чётных
,
при нечётных
. В завершении
вызываем
и получаем ответ.
def f(n): if n < 3: # базовый случай return 5 if n > 3 and n % 2 == 0: # рекурсивный случай 1 return f(n - 2) + 2 * n - 1 if n > 3 and n % 2 != 0: # рекурсивный случай 2 return f(n - 1) * f(n - 2) + 2 print(f(12)) # выводим ответ
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями:
при
при
Чему равно значение функции ? В ответе укажите только целую часть числа.
Рекурсивное решение
В задаче задан рекурсивный алгоритм: функция вызывает саму себя при определённых условиях. Чтобы
реализовать алгоритм программой, создадим функцию. Внутри неё задаём правила: при
,
при
. В завершение вызываем
и получаем ответ.
def f(n): if n <= 2: # базовый случай return 2 if n > 2: # рекурсивный случай return f(n - 1) * (n * n + 5) - 4 * n print(f(5) // f(3)) # выводим ответ
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями:
при
при чётных
при нечётных
Чему равно значение функции ? В ответе укажите только целую часть
числа.
Рекурсивное решение
В задаче задан рекурсивный алгоритм, при котором функция в процессе вычислений вызывает сама себя с другими
аргументами. Для реализации создаём функцию с помощью def. Внутри функции используем условный оператор if
вместе с elif и else, чтобы задать три варианта работы: что возвращать при (базовый случай), при чётных
и при нечётных
. В каждом случае в return записываем соответствующее выражение, что запускает
цепочку рекурсивных вызовов. Процесс продолжается до достижения базового случая
, после чего результаты
возвращаются обратно по цепочке. В завершение вычисляем заданное в условии выражение с использованием функции
и получаем результат.
def f(n): if n <= 0: # базовый случай return n * n if n > 0 and n % 2 == 0: # рекурсивный случай 1 return 5 * f(n // 2) + 2 * f(n - 1) if n > 0 and n % 2 != 0: # рекурсивный случай 2 return f(n - 5) * f(n - 8) # считаем и выводим ответ print((f(12) + f(6)) // (f(7) - f(3)))
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения функции F(n), где n – целое число, задан следующими соотношениями:
при
если
и делится на 3
при
и не делится на 3
Чему равно значение функции ?
Рекурсивное решение
В задаче задан рекурсивный алгоритм, при котором функция в процессе вычислений вызывает сама себя с другими
аргументами. Для реализации создаём функцию с помощью def. Внутри функции используем условный оператор if,
чтобы задать три варианта работы: что возвращать при (базовый случай), при кратных трём
и при
некратных трём
. В каждом случае в return записываем соответствующее выражение, что запускает цепочку
рекурсивных вызовов. Процесс продолжается до достижения базового случая
, после чего результаты
возвращаются обратно по цепочке. В завершение вычисляем заданное в условии выражение с использованием функции
и получаем результат.
def f(n): # объявление функции if n <= 1: # базовый случай return n if n > 1 and n % 3 == 0: # рекурсивный случай 1 return f(n // 3) if n > 1 and n % 3 != 0: # рекурсивный случай 2 return n + f(n + 2) # выводим ответ print(f(17))
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения функции , где
– натуральное число, задан следующими соотношениями:
при
;
, если
и при этом n нечётно;
, если
и при этом n чётно.
Чему равно значение функции ?
Рекурсивное решение
В задаче задан рекурсивный алгоритм, при котором функция в процессе вычислений вызывает сама себя с другими
аргументами. Для реализации создаём функцию с помощью . Внутри функции используем условный оператор
,
чтобы задать три варианта работы: что возвращать при
(базовый случай), при нечётных
и при чётных
. В каждом случае в return записываем соответствующее выражение, что запускает цепочку рекурсивных
вызовов. Процесс продолжается до достижения базового случая
, после чего результаты возвращаются обратно
по цепочке. В завершение вычисляем заданное в условии выражение с использованием функции и получаем
результат.
def f(n): # объявление функции if n <= 5: # базовый случай return 0 if n > 5 and n % 2 == 1: # рекурсивный случай 1 return f(n - 5) + (n + 3) / 2 if n > 5 and n % 2 == 0: # рекурсивный случай 2 return 2 * f(n - 5) + 2 # считаем и выводим ответ print((f(6) + f(8) + f(10)) / f(9) + f(7))
Решение «руками»:
Последовательно находим:
Ошибка.
Попробуйте повторить позже
Последовательность чисел задается рекуррентным соотношением:
при
, если
Чему равно ?
Рекурсивное решение
В задаче задан рекурсивный алгоритм, при котором функция в процессе вычислений вызывает сама себя с другими
аргументами. Для реализации создаём пользовательскую функцию в Python с помощью . Внутри функции
используем условный оператор
вместе с
, чтобы задать два варианта работы: что возвращать при
(базовый случай) и в остальных случаях. В каждом случае в
записываем соответствующее выражение, что
запускает цепочку рекурсивных вызовов. Процесс продолжается до достижения базового случая
, после чего
результаты возвращаются обратно по цепочке. В завершение вычисляем
с использованием функции и получаем
результат.
def f(n): # объявление функции if n > 12: # базовый случай return n + 1 else: # рекурсивный случай return f(n + 1) + 3 * n print(f(5)) # выводим ответ
Решение «руками»:
Последовательно находим:
,
,
,
,
,
,
,
,
.
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения функции , где
– натуральное число, задан следующими соотношениями:
при
;
, если
.
Чему равно значение функции F(8)?
Рекурсивное решение
В задаче задан рекурсивный алгоритм, при котором функция в процессе вычислений вызывает сама себя с другими
аргументами. Для реализации создаём пользовательскую функцию в Python с помощью . Внутри функции
используем условный оператор
, чтобы задать базовый случай: что возвращать при
. Если
, то
выполним рекурсивный вызов, который продолжается до достижения базового случая
, после чего результаты
возвращаются обратно по цепочке. В завершение вычисляем
с использованием функции и получаем
результат.
def f(n): # объявление функции if n <= 2: # базовый случай return 1 # рекурсивный случай, дойдём до этой строчки, # если условие выше (n <= 2) не выполняется, то есть n > 2 return (2 * n + 7) * f(n - 2) print(f(8)) # выводим ответ
Решение руками:
Последовательно находим:
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения функции , где
– натуральное число, задан следующими соотношениями:
, при
, при
Определите значение, которое будет получено при вызове F(7).
Рекурсивное решение
В задаче задан рекурсивный алгоритм, при котором функция в процессе вычислений вызывает сама себя с другими
аргументами. Для реализации создаём пользовательскую функцию в Python с помощью . Внутри функции
используем условный оператор
, чтобы задать базовый случай: что возвращать при
. Если
, то
выполним рекурсивный вызов, который продолжается до достижения базового случая
, после чего результаты
возвращаются обратно по цепочке. В завершение вычисляем
с использованием функции и получаем
результат.
def f(n): # объявление функции if n <= 5: # базовый случай return n * n + 5 # рекурсивный случай, дойдём до этой строчки, # если условие выше (n <= 5) не выполняется, то есть n > 5 return f(n - 2) + n * n - 3 print(f(7)) # выводим ответ
Решение руками:
Последовательно находим:
Ошибка.
Попробуйте повторить позже
Алгоритм вычисления значения функции , где
- натуральное число, задан следующими соотношениями:
при
, если
и n делится на 3,
, если
и n не делится на 3.
Чему равно значение функции ?
Рекурсивное решение
В задаче задан рекурсивный алгоритм, при котором функция вызывает сама себя с другими аргументами. Для
реализации создаём пользовательскую функцию в Python с помощью . Внутри функции используем условный
оператор
, чтобы задать два случая: что возвращать при
(базовый случай) и
, кратным трём. Если
ни одно из этих условий не выполняется, то число больше 5 и некратно трём, поэтому можно сразу вернуть
соответствующее выражение. Цепочка рекурсивных вызовов продолжается до достижения базового случая
,
после чего результаты возвращаются обратно по цепочке. В завершение вычисляем
с помощью функции и
получаем результат.
def f(n): # объявление функции if n < 5: # базовый случай return 2 * (1 + n) if n % 3 == 0: # рекурсивный случай 1 return (n + 1) * f(n - 2) # Рекурсивный случай 2. Дойдём до этой строчки, # если условия выше не выполнятся, то есть # n точно больше 5 и некратно трём return 1 + f(n - 1) + f(n - 2) print(f(10)) # выводим ответ
Решение руками
Последовательно находим:
;
;
;
;
;
;
;
;
;