
Григорьев ЛР / 5 / тп5
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
ассистент |
|
|
|
Е.К. Григорьев |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ № 5 |
РЕКУРСИЯ И ЗАМЫКАНИЯ |
по курсу: ТЕХНОЛОГИИ ПРОГРАММИРОВАНИЯ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
|
|
|
|
|
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2023
1 Цель работы
Познакомиться с основными способами объявления и использования рекурсивных функций, а также механизма замыканий в Python.
2 Ход работы
Вариант: 16
1.4 Напишите рекурсивную функцию recursion_palindrom, на вход которой подается строка. Если строка представляет собой палиндром, то функция должна вернуть значение – True, иначе – False.
Код программы:
def recursion_palindrom(string: str):
if len(string) <= 1:
return True
else:
if string[0] == string[-1]:
return recursion_palindrom(string[1:-1])
else:
return False
inp = input()
while inp.isdigit():
print("Введите строку")
inp = input()
assert recursion_palindrom('abba') == True
assert recursion_palindrom('abbb') == False
print(recursion_palindrom(inp))
1.6 Напишите рекурсивную функцию вычисления числа Фибоначчи fibonacci, на вход которой подается целочисленное значение n.
Код программы:
def fibonacci(n: int):
if n == 1:
return 0
elif n == 2:
return 1
else:
return fibonacci(n-1)+fibonacci(n-2)
inp = int(input())
assert fibonacci(1) == 0
assert fibonacci(2) == 1
print(fibonacci(inp))
1.7
Напишите рекурсивную функцию pow_n, на
вход которой подается два значения n и
k (по умолчанию равно 8). Функция должна
возвращать значение следующего вида:
.
Не учитывая неопределённости.
Код программы:
def pow_n(n: float, k: int = 8):
if k == 0:
return 1
elif k > 0:
return n*pow_n(n, k-1)
elif k < 0:
return 1/(n*pow_n(n, abs(k)-1))
inp1 = int(input())
inp2 = int(input())
while inp1==0 and inp2<0:
print('Деление на ноль, при n==0, вводите k>0')
inp1 = int(input())
inp2 = int(input())
assert (pow_n(2)) == 256
assert (pow_n(2, -2)) == 0.25
print(pow_n(inp1, inp2))
1.11 Напишите рекурсивную функцию remove_brackets, которой на вход подается строка, содержащая одну пару из открывающейся и закрывающейся скобки. Функция должна вернуть строку, состоящую из символов, находящихся в скобках исходной строки.
Код программы:
def remove_brackets(inp: str):
if inp.find('(') == -1 and inp.find(')') == -1:
return inp
elif '(' in inp:
return remove_brackets(inp[inp.find('(')+1:])
else:
return remove_brackets(inp[0: inp.find(')')])
assert remove_brackets('qwe(rty)') == 'rty'
assert remove_brackets('q(wert)y') == 'wert'
inp = str(input())
print(remove_brackets(inp))
2.5 На вход функции closure_comparison поступает один из символов «>», «<», «=». Используя механизм замыканий, сравните два значения, подаваемые на вход возвращаемой функции. В результате должно возвращаться True, если результат сравнения ИСТИНА, иначе – False. В том случае, когда на вход closure_comparison подается неизвестный символ – результат всегда False.
Код программы:
def closure_comparison(symbol: str):
if symbol in ('>', '<', '=='):
def comparison(a: str, b: str):
if eval(str(a)+symbol+str(b)):
return True
else:
return False
return comparison
else:
return False
assert (closure_comparison('>')(6, 5)) == True
assert (closure_comparison('<')(10, 5)) == False
inp = str(input())
inp2 = input()
inp3 = input()
print(closure_comparison(inp)(inp2, inp3))
2.6 На вход функции closure_del_str подается строка. Используя механизм замыканий, удалите из строки задаваемый в возвращаемой функции символ и верните полученный результат.
Код программы:
def closure_del_str(s: str):
def delete(symbol='b'):
result = s.replace(symbol, '')
return result
return delete()
assert closure_del_str('abcde') == 'acde'
assert closure_del_str('aaaad') == 'aaaad'
inp = str(input())
print(closure_del_str(inp))
2.7 Напишите функцию closure_count_str, на вход которой подается строка. Функция должна возвращать другую функцию, принимающую символ и возвращающую количество его повторений.
Код программы:
def closure_count_str(s: str):
def count_str(symbol: str):
result = s.count(symbol)
return result
return count_str
assert closure_count_str('abbb')('b') == 3
assert closure_count_str('ccccc')('c') == 5
inp1 = str(input())
inp2 = str(input())
print(closure_count_str(inp1)(inp2))
3 Вывод
Я освоил основные способы объявления и использования рекурсивных функций, а также механизм замыканий в Python.