Te4nick

kispython_2.1-2.15

May 10th, 2023 (edited)
969
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.45 KB | None | 0 0
  1. # Создайте тип данных односвязный список с помощью ФВП. При создании списка нельзя использовать классы, готовые списки, кортежи и так далее.
  2.  
  3.  
  4. # 2.1. (уровень сложности: высокий)
  5. # Создайте функцию pair(head, tail), которая порождает элемент списка.
  6. # Не используйте ветвления. Создайте также функции head(lst) (возвращает значение головы списка) и tail(lst) (возвращает хвост списка).
  7. def pair(head, tail):
  8.     """Создает элемент списка."""
  9.     return (lambda h: lambda t: lambda f: f(h)(t))(head)(tail)
  10.  
  11. def head(lst):
  12.     """Возвращает значение головы списка."""
  13.     return lst(lambda h: lambda t: h)
  14.  
  15. def tail(lst):
  16.     """Возвращает хвост списка."""
  17.     return lst(lambda h: lambda t: t)
  18.  
  19. # 2.2. (уровень сложности: средний)
  20. # Создайте функцию make_list(*args), которая создает список на основе аргументов.
  21. def make_list(*args):
  22.     """Создает список на основе переданных аргументов."""
  23.     if not args:
  24.         return None
  25.     head, *tail = args
  26.     return pair(head, make_list(*tail))
  27.  
  28.  
  29. # 2.3. (уровень сложности: средний)
  30. # Создайте функцию list_to_string(lst), возвращающую строку, содержащую элементы списка.
  31. def list_to_string(lst):
  32.     """Преобразует список в строку."""
  33.     if not lst:
  34.         return ""
  35.     return str(head(lst)) + " " + list_to_string(tail(lst))
  36.  
  37.  
  38. # 2.4. (уровень сложности: средний)
  39. # Создайте функцию list_range(low, high), возвращающую список чисел от low до high включительно.
  40. def list_range(low, high):
  41.     """Создает список чисел от low до high включительно."""
  42.     return make_list(*range(low, high + 1))
  43.  
  44.  
  45. # 2.5. (уровень сложности: средний)
  46. # Создайте функцию foldl(func, lst, acc), вычисляющую свертку элементов списка, аналогично reduce.
  47. def foldl(func, lst, acc):
  48.     """Вычисляет свертку списка."""
  49.     if not lst:
  50.         return acc
  51.     return foldl(func, tail(lst), func(acc, head(lst)))
  52.  
  53.  
  54. # 2.6. (уровень сложности: средний)
  55. # Создайте функцию list_sum(lst) для вычисления суммы элементов списка с помощью foldl.
  56. def list_sum(lst):
  57.     """Вычисляет сумму элементов списка."""
  58.     return foldl(lambda acc, x: acc + x, lst, 0)
  59.  
  60.  
  61. # 2.7. (уровень сложности: средний)
  62. # Создайте функцию fact(n) для вычисления факториала с помощью foldl и list_range.
  63. def fact(n):
  64.     """Вычисляет факториал числа n."""
  65.     return foldl(lambda acc, x: acc * x, list_range(1, n), 1)
  66.  
  67.  
  68. # 2.8. (уровень сложности: средний)
  69. # Создайте функцию list_to_py(lst) для преобразования списка в обычный список Питона с помощью foldl.
  70. def list_to_py(lst):
  71.     """Преобразует список в обычный список Питона."""
  72.     return foldl(lambda acc, x: acc + [x], lst, [])
  73.  
  74.  
  75. # 2.9. (уровень сложности: средний)
  76. # Создайте функцию list_reverse(lst) для разворота списка в обратном направлении с помощью foldl.
  77. def list_reverse(lst):
  78.     """Разворачивает список в обратном направлении."""
  79.     return foldl(lambda acc, x: pair(x, acc), lst, None)
  80.  
  81.  
  82. # 2.10. (уровень сложности: средний)
  83. # Создайте функцию foldr(func, lst, acc), вычисляющую свертку справа для элементов списка.
  84. def foldr(func, lst, acc):
  85.     """Вычисляет свертку справа для элементов списка."""
  86.     if lst is None:
  87.         return acc
  88.     return func(head(lst), foldr(func, tail(lst), acc))
  89.  
  90.  
  91. # 2.11. (уровень сложности: средний)
  92. # Создайте функцию list_map(func, lst), аналог map, с помощью foldr.
  93. def list_map(func, lst):
  94.     """Применяет функцию func к каждому элементу списка lst."""
  95.     return foldr(lambda x, acc: pair(func(x), acc), lst, None)
  96.  
  97.  
  98. # 2.12. (уровень сложности: средний)
  99. # Создайте функцию list_filter(pred, lst), аналог filter, с помощью foldr.
  100. def list_filter(pred, lst):
  101.     """Фильтрует элементы списка lst с помощью предиката pred."""
  102.     return foldr(lambda x, acc: pair(x, acc) if pred(x) else acc, lst, None)
  103.  
  104.  
  105. # 2.13. (уровень сложности: средний)
  106. # Создайте функцию sum_odd_squares для вычисления суммы квадратов нечетных чисел списка с помощью list_sum, list_map и list_filter.
  107. def sum_odd_squares(lst):
  108.     """Вычисляет сумму квадратов нечетных чисел списка lst."""
  109.     odd_nums = list_filter(lambda x: x % 2 == 1, lst)
  110.     odd_squares = list_map(lambda x: x**2, odd_nums)
  111.     return list_sum(odd_squares)
  112.  
  113.  
  114. # 2.14. (уровень сложности: средний)
  115. # Создайте функцию list_concat(lst1, lst2) для соединения двух списков.
  116. def list_concat(lst1, lst2):
  117.     """Соединяет два списка lst1 и lst2."""
  118.     return foldr(pair, lst1, lst2)
  119.  
  120.  
  121. # 2.15. (уровень сложности: средний)
  122. # Создайте функцию list_replace(lst, index, value) для изменения элемента списка по индексу.
  123. def list_replace(lst, index, value):
  124.     """Заменяет элемент списка lst по индексу index на значение value."""
  125.     if lst is None or index < 0:
  126.         return lst
  127.     elif index == 0:
  128.         return pair(value, tail(lst))
  129.     else:
  130.         return pair(head(lst), list_replace(tail(lst), index - 1, value))
  131.  
  132.  
  133. if __name__ == '__main__':
  134.     # создание списка
  135.     lst = make_list(1, 2, 3, 4, 5)
  136.     print(f'Созданный список: {list_to_string(lst)}')  # 1 2 3 4 5
  137.     # # получение головы и хвоста
  138.     print(f'Голова: {head(lst)} ; Хвост: {list_to_string(tail(lst))}')  # 1 ; 2 3 4 5
  139.     # # создание списка чисел от low до high
  140.     print(f'Список от low до high: {list_to_string(list_range(6, 10))}')  # 6 7 8 9 10
  141.     # # foldl
  142.     print(f'Свертка списка: {foldl(lambda acc, x: acc - x, lst, 0)}')  # -15
  143.     # # вычисление суммы элементов списка
  144.     print(f'Сумма элементов: {list_sum(lst)}')  # 15
  145.     # # вычисление факториала
  146.     print(f'Факториал 5: {fact(5)}')  # 120
  147.     # # преобразование списка в обычный список Питона
  148.     print(f'Преобразование в список Python: {list_to_py(lst)}') # [1, 2, 3, 4, 5]
  149.     # # разворот списка
  150.     print(f'Разворот списка: {list_to_string(list_reverse(lst))}')
  151.     # # foldr
  152.     print(f'Свертка списка справа: {foldr(lambda acc, x: acc - x, lst, 0)}')  # 3
  153.     # # map
  154.     print(f'Map списка: {list_to_string(list_map(lambda x: x*x, lst))}')
  155.     # # filter
  156.     print(f'Фильтрация списка: {list_to_string(list_filter(lambda x: 1 < x < 5, lst))}')
  157.     # # sum_odd_squares
  158.     print(f'Сумма квадратов нечетных чисел: {sum_odd_squares(lst)}')
  159.     # # list_concat
  160.     print(f'Конкатинация списков: {list_to_string(list_concat(lst, list_range(6, 10)))}')
  161.     # # list_replace
  162.     print(f'Изменение элемента по индексу: {list_to_string(list_replace(lst, 2, 10))}')
  163.  
Advertisement
Add Comment
Please, Sign In to add comment