
тп5
.docxГУАП
КАФЕДРА 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
Ассистент |
|
|
|
Е.К. Григорьев |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №5 |
РЕКУРСИЯ И ЗАМЫКАНИЯ |
по курсу: ТЕХНОЛОГИИ ПРОГРАММИРОВАНИЯ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4116 |
|
|
|
|
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2023
Цель работы: познакомиться с основными способами объявления и использования рекурсивных функций, а также механизма замыканий в Python.
Варинат 4.
Задания на рекурсию (6, 12, 13, 14)
Задание 6: Напишите рекурсивную функцию вычисления числа Фибоначчи fibonacci, на вход которой подается целочисленное значение n
Код программы 1:
def fibonacci(n:int):
if n==1:
return 0
if n==2 or n==3:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
n = int(input('Введите число: '))
print(fibonacci(n))
Рисунок 1- результат работы программы 1
Код теста для программы 1:
from fib import fibonacci
def test_fibonacci1():
assert fibonacci(10) == 34
def test_fibonacci2():
assert fibonacci(7) == 8
Рисунок 2- корректная работы теста для программы 1
Задание 12. Пользователь с клавиатуры вводит целое число N. Напишите рекурсивную функцию check_pow2, принимающую на вход 2 аргумента (первый аргумент n, второй аргумент check_value=1) и проверяющую то, является ли введенное значение точной степенью двойки. Если да – выведите в терминал «YES», иначе – «NO» (без кавычек).
Код программы 2:
def check_pow2(n: int, check_value: int):
if n == check_value:
return "Yes"
elif n > check_value and n < 2:
return "No"
else:
return (check_pow2(n / 2, check_value))
n = int(input("Введите n: "))
print(check_pow2(n, check_value=1))
Рисунок 3- результат работы программы 2
Код теста программы 2:
from check_pow2 import check_pow2
def test_check_pow21():
assert check_pow2(1024, 1) == 'Yes'
def test_check_pow22():
assert check_pow2(135, 1) == 'No'
Рисунок 4- корректная работы теста для программы 2
Задание 13: Напишите рекурсивную функцию negative_sum, которой на вход подается список из целочисленных значений и возвращающую сумму отрицательных элементов списка
Код программы 3:
def negative_sum(my_list: list[int]) -> int:
print(my_list)
if len(my_list) == 1 and my_list[0]<0:
return my_list[0]
elif len(my_list) == 1 and my_list[0]>0:
return my_list[0]-my_list[0]
elif my_list[0] < 0:
return my_list[0] + negative_sum(my_list[1:])
else:
return negative_sum(my_list[1:])
my_list = [1, -2, 4, 6, -13]
print(negative_sum(my_list))
Рисунок 5- результат работы программы 5
Код теста для программы 3:
from negative_sum import negative_sum
def test_negative_sum1():
assert negative_sum([3,-5,-7,9,10,-7]) == -19
def test_negative_sum2():
assert negative_sum([43, 67,-100, -1, 8]) == -101
Рисунок 6- корректная работа теста программы 3
Задание
14. Напишите рекурсивную функцию
recursion_pow, на вход которой подается два
целочисленных значения (х – значение,
возводимое в степень и у – степень).
Функция должна возвращать
Код программы 4:
def recursion_pow(x: int, y: int):
if y == 1:
return x
else:
return x * recursion_pow(x, y - 1)
x = int(input("Введите x: "))
y = int(input("Введите y: "))
print(recursion_pow(x, y))
Рисунок 7- результат работы программы 4
Код теста программы 4:
from recursion_pow import recursion_pow
def test_recursion_pow1():
assert recursion_pow(2, 7) == 128
def test_recursion_pow2():
assert recursion_pow(3, 4) == 81
Рисунок 8- корректная работа теста программы 4
Задания на замыкания (5, 6, 9):
Задание 5. На вход функции closure_comparison поступает один из символов «>», «<», «=» Используя механизм замыканий, сравните два значения, подаваемые на вход возвращаемой функции. В результате должно возвращаться True, если результат сравнения ИСТИНА, иначе – False. В том случае, когда на вход closure_ comparison подается неизвестный символ – результат всегда False.
Код программы 5 с тестом:
def closure_comparison(srav):
def sravnenie(a,b):
if srav=='>' or srav=='<' or srav =='==':
return (eval(str(a) + srav + str(b)))
else:
return (False)
return sravnenie
assert closure_comparison('<')(1,3)==True
assert closure_comparison('>')(10,100)== False
print(closure_comparison('==')(20,10))
Рисунок 9- результат работы программы 5
Задание 6. На вход функции closure_del_str подается строка. Используя механизм замыканий, удалите из строки задаваемый в возвращаемой функции символ и верните полученный результат.
Код программы 6 с тестом:
def closure_del_str(my_str:str)-> str:
def symbol(a='р'):
return(my_str.translate({ord(a): None }))
return symbol
assert closure_del_str('руоташрарвры')('р') =='уоташавы'
assert closure_del_str('работа')("р") =='абота'
b= closure_del_str('Привет, приветик , привет')()
print(b)
Рисунок 10- результат работы программы
Задание 9. Напишите функцию closure_list_pow, на вход которой подается список целочисленных или вещественных значений. Используя механизм замыкания верните функцию, принимающую значение степени, в которую необходимо возвести каждый элемент списка и возвращающую полученный результат.
Код программы 7 с тестом:
def closure_list_pow(my_list:list)-> list:
def pow(a):
new_list= [x **a for x in my_list]
return (new_list)
return pow
assert closure_list_pow([1,2,3,4])(2)==[1,4,9,16]
assert closure_list_pow([1,2,1,4,10])(4)==[1,16,1,256, 10000]
print (closure_list_pow([1,2,5,7,8,9])(3))
Рисунок 11- результат работы программы 7
Вывод: ознакомилась с основными способами объявления и использования рекурсивных функций, а также механизма замыканий в Python