20 практических заданий с рекурсией в Python. Python практика.

В этой статье мы предложим практические задания для самостоятельного решения на Python. Практика написания кода – лучший способ, прокачать свои навыки.

https://t.me/python_job_interview – в нашем канале еще больше полезных практических задач.

# 10 Простых заданий + 10 сложных заданий

Простые задания

1) Факториал

Напишите рекурсивную функцию factorial(n), которая будет принимать положительное целое число n и возвращать факториал от этого числа (1 x 2 x 3 x … x n).

factorial(1)   # 1
factorial(2)   # 2
factorial(3)   # 6
factorial(4)   # 24
factorial(5)   # 120
factorial(6)   # 720
factorial(7)   # 5040
factorial(8)   # 40320

2) Суммирование

Напишите рекурсивную функцию summation(n), которая будет принимать положительное целое число n и возвращать сумму чисел от 1 до n.

summation(1)  # 1
summation(2)  # 3
summation(3)  # 6
summation(4)  # 10
summation(5)  # 15
summation(6)  # 21
summation(7)  # 28
summation(8)  # 36

3) Сумма нечётных чисел

Напишите рекурсивную функцию sum_odd(lis), которая будет принимать список из целых чисел и возвращать сумму только нечётных чисел из списка.

sum_odd([1,2,3,4])    # 4
sum_odd([1,2,3,4,5])  # 9
sum_odd([1,2,4,6,8])  # 1
sum_odd([])           # 0
sum_odd([2,4,6,8])    # 0

 

4) Сумма нечётных чисел и вычитание чётных чисел

Напишите рекурсивную функцию sum_sub(list), которая будет принимать список целых чисел. Эта функция будет суммировать все нечётные числа и вычитать все чётные числа. В конце она будет возвращать получившееся значение.

sum_sub([1,2,3,4])   # -2 
sum_sub([1,2,3,4,5]) # 3
sum_sub([1,3,5])     # 9
sum_sub([2,4,6])     # -12
sum_sub([99,10,10])  # 79

5) Слова-палиндромы

Слова-палиндромы — это строки, которые одинаково читаются с обеих сторон. Например: «aba», «abba», «abcba», «aaa», «ababa» и так далее.

Напишите функцию is_palindrome(string), которая будет принимать строку и возвращать «True», если строка является палиндромом, и «False» во всех других случаях.

is_palindrome('aba')     # True
is_palindrome('abba')    # True
is_palindrome('abcba')   # True

is_palindrome('abc')     # False
is_palindrome('abbb')    # False
is_palindrome('abab')    # False

6) Палиндромы, игнорирующие пробелы

Напишите функцию is_pal(string), которая будет принимать строку и возвращать «True», если строка — палиндром (при этом игнорируя все пробелы), и «False» во всех других случаях.

is_pal('aba')      # True
is_pal('ab   a')   # True
is_pal(' a z  a')  # True

is_pal('ab a b')   # False
is_pal('a a  ba')  # False
is_pal('a z a a')  # False

7) Удаление гласных букв

Напишите функцию remove_vowels(string), которая будет принимать строку и возвращать только согласные буквы. 

remove_vowels('apple')     # ppl
remove_vowels('orange')    # rng
remove_vowels('pear')      # pr
remove_vowels('pineapple') # pnppl
remove_vowels('durian')    # drn
remove_vowels('banana')    # bnn

8) Удвоенные буквы

Напишите функцию double(string), которая будет принимать строки и возвращать другую версию строки, в которой все буквы будут удваиваться.

double('apple')   # aappppllee
double('orange')  # oorraannggee
double('pear')    # ppeeaarr
double('abc')     # aabbcc
double('zz')      # zzzz

9) Треугольник Паскаля

Треугольник Паскаля выглядит так: 

20 практических заданий с рекурсией в Python. Python практика.

Напишите функцию pascal(n), которая будет принимать положительные целые числа n и возвращать n-ую строку треугольника Паскаля.

10) Число Фибоначчи

Напишите рекурсивную функцию fib(n), которая будет принимать положительное целое число n и возвращать n-ое число Фибоначчи.

Числа Фибоначчи — это серия чисел, которая начинается с 0 и 1. Каждое последующее число будет являться суммой двух предыдущих чисел.

fib(1)   # 0
fib(2)   # 1
fib(3)   # 1
fib(4)   # 2
fib(5)   # 3
fib(6)   # 5
fib(7)   # 8
fib(8)   # 13
fib(9)   # 21
fib(10)  # 34

Менее выполнимые задания

11) Генерация перестановок

Напишите рекурсивную функцию permutations(list, length), которая будет принимать список с его элементами и целочисленную длину, и возвращать все возможные перестановки относительно длины внутри списка.

permutations([1,2,3], 2)

# [(1,2), (1,3), (2,3), (2,1), (3,1), (3,2)] 

permutations([1,2,3,4], 2)

# [(1,2), (1,3), (1,4), (2,1), (2,3), (2,4),
# (3,1), (3,2), (3,4), (4,1), (4,2), (4,3)]

Вы не должны пользоваться встроенными функциями, потому что это жульничество.

12) Генерация комбинаций

Напишите рекурсивную функцию combinations(list, length), которая будет принимать список с его элементами и целочисленную длину, и возвращать все возможные комбинации длины внутри списка.

Combinations([1,2,3], 2)

# [(1,2), (1,3), (2,3)] 

permutations([1,2,3,4], 2)

# [(1,2), (1,3), (1,4), (2,3), (2,4), (3,4)]

13) Поиск в глубину с использованием рекурсии

У вас есть словарь, который представляет из себя сеть друзей.

g = {
1: [2,3], # 1 is friends with 2 and 3
2: [1], # 2 is friends with 1
3: [1,4], # 3 is friends with 1 and 4
4: [3], # etc
5: [6],
6: [5,7],
7: [6]
} 

Напишите рекурсивную функцию, которая будет принимать id человека и находить всех его друзей, друзей их друзей и так далее.

friends(1) # [1,2,3,4]
friends(2) # [1,2,3,4]
friends(3) # [1,2,3,4]
friends(4) # [1,2,3,4]

friends(5) # [5,6,7]
friends(6) # [5,6,7]
friends(7) # [5,6,7] 

14) Проверка наличия выхода в лабиринте

Вам дам список строк, который представляет из себя лабиринт. 

maze = [
  'S----',
  '##---',
  '---##',
  '----X'
]


s означает стартовую позицию (откуда игрок начинает);

x означает финиш (цель прохождения лабиринта);

– означает свободный путь, по которому может осуществлять движение игрок;

# означает стену, через которую игрок не может пройти.

Некоторые правила:

Игрок может двигаться только на 1 шаг за один раз;

Игрок может двигаться только в 4 направлениях: вверх, вниз, влево, вправо.

Лабиринт проходим, если игрок может пройти до x из s. Напишите рекурсивную функцию, которая будет принимать лабиринт и возвращать «True», если он проходим, и «False» в любом другом случае.

15) Прохождение лабиринта

Используя точно такой же лабиринт, как и в задании 14, напишите рекурсивную функцию, которая будет возвращать решение лабиринта, позволяющее игроку добраться до финиша.

maze = [
  'S----',
  '##---',
  '---##',
  '----X'
]

solve(maze) # ['right', 'right', 'down', 'down', 'down', 'right', 'right']

Это не обязательно должно быть короткое решение — любое возможное решение. Если лабиринт невозможно пройти, просто верните [].

16) Поиск VideoID

Вам дан неупорядоченный словарь, содержащий в себе несколько вложенных структур данных. Некоторые из них (независимо от вложенности) содержать ключ VideoID.

data = {
    "type": "video",
    "videoID": "vid001",
    "links": [
        {"type":"video", "videoID":"vid002", "links":[]},
        {   "type":"video", 
            "videoID":"vid003",
            "links": [
            {"type": "video", "videoID":"vid004"},
            {"type": "video", "videoID":"vid005"},
            ]
        },
        {"type":"video", "videoID":"vid006"},
        {   "type":"video",
            "videoID":"vid007",
            "links": [
            {"type":"video", "videoID":"vid008", "links": [
                {   "type":"video", 
                    "videoID":"vid009",
                    "links": [{"type":"video", "videoID":"vid010"}]
                }
            ]}
        ]},
    ]
}

Напишите рекурсивную функцию, целью которой будет извлечение всех значений с ключом «VideoID».

output = [
  {'videoID': 'vid001'}, {'videoID': 'vid002'}, 
  {'videoID': 'vid003'}, {'videoID': 'vid004'}, 
  {'videoID': 'vid005'}, {'videoID': 'vid006'}, 
  {'videoID': 'vid007'}, {'videoID': 'vid008'}, 
  {'videoID': 'vid009'}, {'videoID': 'vid010'}
]

17) Конвертирование множеств в списки во вложенной структуре данных

Вам дана неупорядоченная структура данных, которая содержит в себе списки, множества и словари. 

d = {'a': [
{1,2,3},
[1,2,3],
{1:1, 2:2, 3:3}
],
'b': [
[1,2,3],
{
1: {1,2,3,4},
2: {1,2,3,4},
3: {1,2,3,4}
}
]} 

Вы желаете конвертировать эту структуру данных в строку JSON, но множества не могут быть конвертированы в JSON. Напишите рекурсивную функцию, которая будет конвертировать все множества из этой структуры данных в списки.

output = {'a': [
      [1,2,3],
      [1,2,3],
      {1:1, 2:2, 3:3}
    ], 
    'b': [
      [1,2,3],
      {
        1: [1,2,3,4],
        2: [1,2,3,4],
        3: [1,2,3,4]
      }
    ]}

18) Наименьшее количество монет

Напишите рекурсивную функцию, которая будет принимать 1) значение 2) список монет и возвращать наименьшее количество монет, которые в сумме составляют значение.

coins(10, [2, 5])  # {5:2}

# 2 $5 coins make up $10
# 5 $2 coins also make up $10

# we chose 2 coins over 5 coins because fewer coins.
coins(8, [2, 5])  # {2:4}

# 4 $2 coins make up $8. This is the only solution
coins(11, [1,2,3]) # {3:3, 2:1}

# 3 $3 coins + 1 $2 coin make up $11
coins(11, [2,4]) # {}

# no solution

19) Рекурсия os.walk без использования функции os.walk.

Вам дана вложенная папка с вещами.

baseFolder
|- folderA
  |- folderAA
    |- 1.txt
  |- folderAB
  |- folderAC
  |- 2.txt
|- folderB
  |- folderBA
    |- 3.txt
    |- folderBAA
      |- 4.txt
      |- 5.txt
    |- folderBAB
    |- folderBAC
      |- 6.txt
  |- folderBB
|- folderC
  |- 7.txt
  |- folderCA
  |- folderCB

Без использования встроенной функции os.walk, напишите рекурсивную функцию, которая будет принимать путь к главной папке и подсчитывать количество подпапок + общее количество файлов.

output = {'numFolders':13, 'numFiles': 7} 

20) Ханойская башня

Цель этой игры — переместить все кольца из А в С.

Некоторые правила:

1. Вы можете двигать только одно кольцо за раз;

2. Большое кольцо не может находиться выше маленького.

Напишите рекурсивную функцию hanoi(n), которая будет принимать целочисленное число n, являющееся количеством колец, и выводить шаги для перемещения всех колец пирамиды от А до С.

hanoi(1)

# A to C
hanoi(2)

# A to B
# A to C
# B to C
hanoi(3)

# A to C
# A to B
# C to B
# A to C
# B to A
# B to C
# A to C

Заключение!

Надеюсь, что это было непросто!

Несколько финальных слов

Если эта статья оказалась полезной для вас, вы могли бы оказать мне поддержку (поставить лайк, поделиться ею с друзьями, )!

+1
5
+1
9
+1
2
+1
1
+1
2

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *