Similar presentations:
Занятие 3.1 Рекурсия
1.
Рекурсия2.
Функция• Функция — это мини-программа внутри вашей
программы. Это именованный блок кода, который
выполняет определенную задачу.
• Зачем они нужны?
• 1. Избежать повторов. Если вам нужно 10 раз посчитать
площадь треугольника, лучше 1 раз написать функцию,
чем 10 раз копировать формулу.
• 2. Разделение задач. Проще искать ошибки, когда код
разбит на логические куски.
3.
Синтаксис• def имя_функции(параметры):
# Тело функции
# Код, который что-то делает
4.
returnВозврат результата из функции.
def calc_sum(a, b):
result = a + b
return result # ВЕРНУЛИ результат в программу
# Мы можем сохранить результат в переменную
x = calc_sum(5, 10)
# И использовать его дальше
final = x * 2
print(final) # Выведет 30
• Правило: В месте вызова функции код как бы заменяется на то, что
вернул return.
• x = calc_sum(5, 10) превращается компьютером в x = 15.
5.
Функция без return• def say_hello(a, b):
result = a + b
print(result) # ПРОСТО ПОКАЗАЛИ на экране
• # Попытка сохранить результат
• x = say_hello(5, 10) # На экране появится 15
• # Но что внутри x?
• print(x) # Выведет None
• В Python, если в функции нет return, она неявно
возвращает специальное значение None (пустоту).
Математику с None делать нельзя.
6.
Сравнение7.
Рекурсия• Рекурсия — это когда функция вызывает сама себя.
• Чтобы рекурсия не была бесконечной (как while True), у
неё должны быть две части:
• 1. Базовый случай (Условие остановки): Ситуация, когда
функция выдает готовый ответ без новых вызовов
(например, if n == 0: return 0).
• 2. Рекурсивный шаг: Вызов функции с измененным
аргументом, приближающим нас к базовому случаю
(например, return n + F(n-1)).
8.
Пример 1• Задача:
• F(n) = 1, при n = 1
• F(n) = n + F(n-1), при n > 1
• Чему равно F(5)?
• def F(n):
if n == 1:
return 1
if n > 1:
return n + F(n - 1)
• print(F(5))
9.
Задача 1• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = 1 при n < 3;
• F(n) = F(n − 2) − F(n − 1), если n > 2 и при этом n чётно;
• F(n) = 2 × F(n − 1) − F(n − 2), если n > 2 и при этом n нечётно.
• Чему равно значение функции F(15)?
10.
Задача 1• def f(n):
if n<3: return 1
elif n%2==0: return f(n-2) - f(n-1)
return 2*f(n-1) - f(n-2)
• print(f(15))
11.
Порядок выполнения• def F(n):
print(f"Спуск: я зашел в F({n})") # Действие ДО вызова (Прямой ход)
if n == 1:
print("ДНО! Базовый случай")
return 1
# Рекурсивный вызов
res = F(n - 1)
print(f"Подъем: я вернулся в F({n}), мне принесли результат {res}") #
ПОСЛЕ вызова (Обратный ход)
return n + res # Возвращаем результат еще выше
• print("Ответ:", F(3))
12.
Порядок выполнения• def G(n):
if n >= 1:
G(n-1)
print(n)
• Что выведет G(3)?
13.
Задача 2Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан
• следующими соотношениями:
• F(n) = 1 при n = 1;
• F(n) = n + F(n − 1), если n > 1.
• Чему равно значение выражения F(2023) – F(2020)?
14.
Глубина рекурсии• По умолчанию Python по умолчанию ограничивает
глубину рекурсии (~1000 вызовов).
• Для увеличения глубины рекурсии можно использовать:
• import sys
• sys.setrecursionlimit(...)
15.
Задача 2• import sys
• sys.setrecursionlimit(3000)
• def f(n):
if n==1: return 1
return n + f(n-1)
• print(f(2023) - f(2020))
16.
Задача 3• Условие:
• Алгоритм вычисления функции F(n) задан
соотношениями:
• F(n) = 1, при n <=2
• F(n) = F(n-1) + F(n-2), при n > 2
• Чему равно значение функции F(2024)?
17.
Мемоизация• Мы считаем одно и то же миллионы раз.
• Чтобы найти F(5), мы считаем F(4) и F(3).
• Чтобы найти F(4), мы снова считаем F(3) и F(2).
• В итоге F(3) считается для каждого родителя заново.
Дерево вызовов растет в ширину очень быстро.
• Чтобы не считать одно и тоже, нужно позволить функции
запоминать уже рассчитанные значения. Для этого нужно
добавить в начале кода следующее:
• from functools import lru_cache
• @lru_cache(None)
18.
Прогрев кэша• Перед решением основной задачи пишем:
• for i in range(1, 2025):
F(i)
• Благодаря циклу for, рекурсия никогда не углубляется
больше чем на 1 шаг. В процессе мы постепенно
заполняем кэш.
19.
Задача 3• from functools import lru_cache
• @lru_cache(None)
• def F(n):
if n <= 2:
return 1
return F(n - 1) + F(n - 2)
• for i in range(1, 2025):
F(i)
• print(F(2024))
20.
Задача 4• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = 6 при n < 7;
• F(n) = n + F(n − 1), если n ≥ 7.
• Чему равно значение выражения F(2023) – F(2021)?
21.
Задача 5• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = 10 при n < 11;
• F(n) = n + F(n − 1), если n ≥ 11.
• Чему равно значение выражения F(2024) – F(2021)?
22.
Задача 6• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = 1 при n < 3;
• F(n) = F(n − 2) − F(n − 1), если n > 2 и при этом n чётно;
• F(n) = 2 × F(n − 1) − F(n − 2), если n > 2 и при этом n нечётно.
• Чему равно значение функции F(31)?
23.
Задача 7• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = 3 при n < 3;
• F(n) = n + F(n − 2), если n ≥ 3.
• Чему равно значение выражения F(2022) – F(2018)?
24.
Задача 8• Алгоритм вычисления значения функции F(n), где n –
целое неотрицательное число, задан следующими
соотношениями:
• F(n) = 0 при n ≤ 1;
• F(n) = 2 × n + F(n − 1), если n > 1 и при этом n нечётно;
• F(n) = 2 × F(n − 1) , если n > 1 и при этом n чётно.
• Чему равно значение функции F(24)?
25.
Задача 9• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = 1 при n < 3;
• F(n) = F(n − 2) − F(n − 1), если n > 2 и при этом n чётно;
• F(n) = 2 × F(n − 1) − F(n − 2), если n > 2 и при этом n нечётно.
• Чему равно значение функции F(19)?
26.
Задача 10• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = 1 при n < 3;
• F(n) = F(n − 1) + n − 1, если n > 2 и при этом n чётно;
• F(n) = F(n − 2) + 2 × n − 2, если n > 2 и при этом n нечётно.
• Чему равно значение функции F(36)?
27.
Задача 11• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = 1 при n = 1;
• F(n) = n + F(n − 1), если n чётно;
• F(n) = 2 × F(n − 2), если n > 1 и при этом n нечётно.
• Чему равно значение функции F(24)?
28.
Задача 12• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = 1 при n < 3;
• F(n) = F(n − 2) − F(n − 1), если n > 2 и при этом n чётно;
• F(n) = 2 × F(n − 1) − F(n − 2), если n > 2 и при этом n нечётно.
• Чему равно значение функции F(18)?
29.
Задача 13• Алгоритм вычисления значения функции F(n), где n –
целое неотрицательное число, задан следующими
соотношениями:
• F(n) = 0 при n ≤ 1;
• F(n) = 2 × n + F(n − 1), если n > 1 и при этом n нечётно;
• F(n) = 2 × F(n − 1) , если n > 1 и при этом n чётно.
• Чему равно значение функции F(22)?
30.
Задача 14• Алгоритм вычисления значения функции F(n), где n –
целое неотрицательное число, задан следующими
соотношениями:
• F(n) = 0 при n ≤ 1;
• F(n) = 2 × F(n − 1) + 2, если n > 1 и при этом n нечётно;
• F(n) = n / 2 + F(n − 1), если n > 1 и при этом n чётно.
• Чему равно значение функции F(26)?
• Примечание. При вычислении значения F(n) используется
операция целочисленного деления.
31.
Задача 15• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = 1 при n = 1;
• F(n) = n + F(n − 1), если n чётно;
• F(n) = 2 × F(n − 2), если n > 1 и при этом n нечётно.
• Чему равно значение функции F(24)?
32.
Задача 16• Алгоритм вычисления значения функции F(n), где n –
целое неотрицательное число, задан следующими
соотношениями:
• F(n) = 0 при n ≤ 1;
• F(n) = 2 × F(n − 1) + 2, если n > 1 и при этом n нечётно;
• F(n) = n / 2 + F(n − 1), если n > 1 и при этом n чётно.
• Чему равно значение функции F(28)? Примечание. При
вычислении значения F(n) используется операция
целочисленного деления.
33.
Задача 17• Алгоритм вычисления значения функции F(n), где n –
целое неотрицательное число, задан следующими
соотношениями:
• F(n) = 0 при n ≤ 1;
• F(n) = 2 × F(n − 1) + 2, если n > 1 и при этом n нечётно;
• F(n) = n / 2 + F(n − 1), если n > 1 и при этом n чётно.
• Чему равно значение функции F(30)?
• Примечание. При вычислении значения F(n) используется
операция целочисленного деления.
34.
Задача 18• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = 2 при n < 3;
• F(n) = F(n − 2) + F(n − 1) – n, если n > 2 и при этом n чётно;
• F(n) = F(n − 1) − F(n − 2) + 2 × n, если n > 2 и при этом n
нечётно.
• Чему равно значение функции F(32)?
35.
Задача 19• Алгоритм вычисления значения функции F(n), где n –
целое неотрицательное число, задан следующими
соотношениями:
• F(n) = 0 при n ≤ 1;
• F(n) = (n + 1) / 2 + F(n − 1), если n > 1 и при этом n нечётно;
• F(n) = 2 × F(n − 1) + 1, если n > 1 и при этом n чётно.
• Чему равно значение функции F(33)?
• Примечание. При вычислении значения F(n) используется
операция целочисленного деления
36.
Задача 20• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = 1 при n = 1;
• F(n) = n – 2 + F(n − 1), если n > 1.
• Чему равно значение выражения F(2024) – F(2022)?
37.
Задача 21• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = 3 при n = 1;
• F(n) = n + 2 + F(n − 1), если n > 1.
• Чему равно значение выражения F(2023) – F(2021)?
38.
Задача 22• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = n при n >= 2025;
• F(n) = n + F(n + 2), если n < 2025.
• Чему равно значение выражения F(2022) – F(2023)?
39.
Задача 23• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = n при n >= 2025;
• F(n) = n + 3 + F(n + 3), если n < 2025.
• Чему равно значение выражения F(2018) – F(2022)?
40.
Задача 24• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = n при n >= 2025;
• F(n) = n + 3 + F(n + 3), если n < 2025.
• Чему равно значение выражения F(23) – F(21)?
41.
Задача 25• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = 5 при n = 1;
• F(n) = 2n + 1 + F(n - 1), если n > 1.
• Чему равно значение выражения F(2024) – F(2022)?
42.
Задача 26• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = 3 при n = 1;
• F(n) = 3n + 2 · F(n - 1), если n > 1.
• Чему равно значение выражения
• F(2024) – 4 · F(2022)?
43.
Задача 27• Алгоритм вычисления значения функции F(n), где n –
натуральное число, задан следующими соотношениями:
• F(n) = 1 при n = 1;
• F(n) = 2 при n = 2;
• F(n) = n · (n-1) + F(n - 1) + F(n - 2), если n > 2.
• Чему равно значение выражения F(2024) – F(2022) – 2 ·
F(2021) – F(2020)?
44.
Ответы• 4) 4045
• 5) 6069
• 6) 114243
• 7) 4042
• 8) 40852
• 9) 577
• 10) 648
• 11) 2072
• 12) 169
• 13) 20380
• 14) 24559
• 15) 2072
45.
Ответы• 16) 49134
• 17) 98285
• 18) 3194
• 19) 262124
• 20) 4043
• 21) 4049
• 22) 2024
• 23) 4049
• 24) 1338
• 25) 8096
• 26) 18210
• 27) 12271520
programming