Рекурсия
Суть в том что бы понять как работает рекурсия.
Тут собран набор простых и не очень задачь для того чтобы рекурсия перестала пугать твои неокрепшие програмисткие навыки.
Начнем с базы. Рекурсия похожа на цикл, или проще говоря у неё тоже есть момент когда она должна остановиться.
Нечто похожее на цикл while
или for
или вообще на reduce
из мира функционального программирования.
Что такое рекурсия? Рекурсия это самоподобие.
Для того чтобы закодить рекурсию обычно необходимо найти две вещи:
- Граничный случай - рекурсия отработает и больше не будет выполнятся
- Рекурсивный случай - рекурсия вызывает саму себя
Это необходимо чтобы не произошел “бесконечный цикл”
0
Закодить цикл for от N-1 до 0 (включительно) не используя ключевые слова while
и for
def other_func(n):
print(n)
for_from(5, other_func)
Вывод:
4
3
2
1
0
1
Закодить цикл for от 0 до N (0 <= N) не используя ключевые слова while
и for
что то вот такое:
def other_func(n):
print(n)
for_n(5, other_func)
вывод:
0
1
2
3
4
2
Классическая задача.
Суммирование. На вход подается массив. Нужно найти сумму. По прежнему цикл или функцию sum
использовать низя.
Но можно использовать слайсы: arr[1:10]
sum_rec([1, 2, 3, 4, 5, 6])
3
Обход дерева.
{
"name": "other string root",
"children": [
{
"name": "other string 1",
"children": []
},
{
"name": "other string 2",
"children": []
},
]
}
Нужно пройтись по входяшему джсону или похожем объекте и вывести все имена.
Должен получиться такой вывод:
other string root
other string 1
other string 2
Примечание Для пустого массива детей рекурсию можно не вызывать
4
Обход дерева. Усложненный
{
"tag": "root",
"left_nodes": [
{
"name": 1,
"left_nodes": [
{
"name": 2,
"left_nodes": [],
"right_nodes": []
}
],
"right_nodes": [
{
"tag": "puk",
"left_nodes": [],
"right_nodes": []
},
]
},
{
"name": 3,
"left_nodes": [],
"right_nodes": []
},
],
"right_nodes": [
{
"tag": "1",
"children": []
},
{
"tag": "2",
"children": []
},
]
}
Нужно пройтись по входяшему джсону или похожем объекте и вывести все имена.
Имя левых нод - "left node " + str(-name)
Имя правых нод - "right node tag:" + tag
Корневая нода - правая
Должен получиться такой вывод:
right node tag:root
left node -1
left node -2
right node tag:puk
left node -3
right node tag:1
right node tag:2