Файл: Сборник упражнений.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 17.03.2024

Просмотров: 161

Скачиваний: 11

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

152
Упражнения рой, которую заранее надо преобразовать в строку, и вернуть полученную строку в качестве результата функции.
Напишите основную программу, которая будет использовать рекурсив- ную функцию для преобразования неотрицательного числа, введенного пользователем, из десятичной системы счисления в двоичную. Если будет введено отрицательное значение, программа должна вывести соответ- ствующее сообщение об ошибке.
Упражнение 176. Фонетический алфавит НАТО
(33 строки)
Фонетический алфавит представляет собой таблицу обозначений букв, каждой из которых соответствует то или иное слово. Широкое распростра- нение такие алфавиты приобретают в условиях повышенной зашумлен- ности каналов передачи информации, когда собеседник может просто не расслышать конкретную букву. В таких случаях вместо букв используются целые слова. Один из наиболее распространенных фонетических алфа- витов был разработан в военном блоке НАТО. Соответствие букв и слов в нем приведено в табл. 8.1.
Напишите программу, которая будет запрашивать слово у пользовате- ля и отображать его на экране в виде шифра из соответствующих слов, обозначающих буквы исходного текста. Например, если пользователь введет слово Hello, на экране должна быть отображена следующая по- следовательность слов: Hotel Echo Lima Lima Oscar. Для решения этой за- дачи вам предстоит использовать рекурсивную функцию, а не циклы.
При этом все небуквенные символы, введенные пользователем, можно игнорировать.
Таблица 8.1. Фонетический алфавит НАТО
Буква
Слово
Буква
Слово
Буква
Слово
A
Alpha
J
Juliet
S
Sierra
B
Bravo
K
Kilo
T
Tango
C
Charlie
L
Lima
U
Uniform
D
Delta
M
Mike
V
Victor
E
Echo
N
November
W
Whiskey
F
Foxtrot
O
Oscar
X
Xray
G
Golf
P
Papa
Y
Yankee
H
Hotel
Q
Quebec
Z
Zulu
I
India
R
Romeo

Рекурсия

153
Упражнение 177. Римские цифры
(25 строк)
Как ясно из названия, римские цифры появились еще в Древнем Риме. Но даже после падения Римской империи они продолжали использоваться на территории Европы вплоть до позднего Средневековья, а в определенных случаях применяются и сегодня.
Римские цифры базируются на обозначениях M, D, C, L, X, V и I, со- ответствующих числам 1000, 500, 100, 50, 10, 5 и 1. В основном римские цифры в составляющих их числах располагаются в порядке убывания – от больших к меньшим. В этом случае итоговое число равно сумме всех со- ставляющих его римских цифр. Если цифры меньшего номинала пред- шествуют цифрам большего номинала, то первые вычитаются из вторых и итог прибавляется к общей сумме. В такой манере могут использоваться римские цифры C, X и I. При этом вычитание производится только из чи- сел, максимум в десять раз превосходящих вычитаемое. Таким образом, цифра I может предшествовать V или X, но не может вычитаться из L, C, D или M. А значит, число 99 должно быть написано как XCIX, а не IC.
Создайте рекурсивную функцию, которая будет переводить римскую запись чисел в десятичную. Функция должна обрабатывать один или два символа в начале строки, после чего будет производиться ее рекурсивный вызов для оставшихся символов. Используйте пустую строку с возвращае- мым значением 0 в качестве базового случая. Также напишите основную программу, которая будет запрашивать у пользователя число, введенное римскими цифрами, и отображать его десятичный эквивалент. При этом можно сделать допуск о том, что пользователь всегда вводит корректное число, так что обработку ошибок вам реализовывать не нужно.
Упражнение 178. Рекурсивные палиндромы
(Решено. 30 строк)
Определение палиндрома мы дали еще в главе 75, а в данном упражнении вам предстоит написать рекурсивную функцию, определяющую, является ли переданная ей в виде аргумента строка палиндромом. Стоит отметить, что пустая строка является палиндромом по определению, как и строка, состоящая из одного символа. Более длинные строки можно считать па- линдромами, если их первый и последний символы одинаковые, а под- строка, исключающая эти символы, также является палиндромом.
Напишите основную программу, которая будет запрашивать у пользо- вателя слово и при помощи рекурсивной функции определять, является ли оно палиндромом. В результате на экране должно появиться соответ- ствующее сообщение.


154
Упражнения
Упражнение 179. Рекурсивный квадратный корень
(20 строк)
В упражнении 74 вы узнали, как можно при помощи итераций вычислить квадратный корень из числа. В той задаче с каждой итерацией цикла увеличивалась точность приближения расчета. Здесь мы будем приме- нять похожую тактику приближения, но с использованием рекурсии, а не цикла.
Напишите функцию вычисления квадратного корня с двумя входными параметрами. Первый из них – n – будет характеризовать число, из кото- рого вычисляется квадратный корень, а второй – guess – текущее прибли- жение при его вычислении. Значение параметра guess по умолчанию при- мем за 1,0. У первого параметра значения по умолчанию быть не должно.
Функция вычисления корня должна быть рекурсивной. Базовый случай будет возникать тогда, когда guess
2
будет отличаться от n менее чем на
10
–12
. В этом случае функция должна возвращать guess, считая, что полу- ченное число достаточно близко к квадратному корню от заданного n.
В противном случае функция должна возвращать результат рекурсивно- го вызова себя самой с n в качестве первого параметра и в качестве второго.
Напишите основную программу, в которой будет демонстрироваться работа вашей функции на примере вычисления квадратного корня из нескольких чисел. При первом вызове функции в основной программе необходимо передать ей лишь один параметр, а значение второго – guess – возьмется по умолчанию.
Упражнение 180. Редакционное расстояние
(Решено. 43 строки)
Редакционное расстояние между двумя строками представляет собой меру их схожести. Чем меньше между строками редакционное расстоя- ние, тем более похожими они могут считаться. Это означает, что одна строка может быть преобразована в другую с минимальным количеством операций вставки, удаления и замены символов.
Рассмотрим слова kitten и sitting. Первое слово может быть трансфор- мировано во второе путем выполнения следующих операций: заменить k
на s, заменить e на i и добавить g в конец строки. Это минимально воз- можное количество операций, необходимое для преобразования слова kitten в sitting. Таким образом, редакционное расстояние между этими строками составляет 3.
Напишите рекурсивную функцию, вычисляющую редакционное рас- стояние между двумя строками по следующему алгоритму.

Рекурсия

155
Имеем исходные строки s и t
Если длина строки s равна нулю, тогда
Возвращаем длину строки t
Если длина строки t равна нулю, тогда
Возвращаем длину строки s
Иначе
Устанавливаем переменную cost равной 0
Если последний символ в s не совпадает с последним символом в t, тогда
Устанавливаем cost равной 1
Устанавливаем d1 равной редакционному расстоянию между строкой s без последнего символа и строкой t с прибавлением единицы
Устанавливаем d2 равной редакционному расстоянию между строкой t без последнего символа и строкой s с прибавлением единицы
Устанавливаем d3 равной редакционному расстоянию между строкой s без последнего символа и строкой t без последнего символа с прибавлением cost
Возвращаем минимальное значение среди d1, d2 и d3
Используйте написанную вами рекурсивную функцию в основной про- грамме, запрашивающей у пользователя две строки и выводящей на экран редакционное расстояние между ними.
Упражнение 181. Возможный размен
(41 строка)
Напишите программу, которая будет определять, можно ли составить конкретную сумму из определенного количества монет. Например, мож- но набрать доллар из четырех монет номиналом в 25 центов. Но при по- мощи пяти монет доллар никак не собрать. При этом из шести монет это снова возможно, если взять три монеты по 25 центов, две – по 10 и одну номиналом в 5 центов. Также возможно собрать сумму $1,25 из пяти или восьми монет, но не удастся это сделать с четырьмя, шестью или семью монетами.
Ваша основная программа должна запрашивать у пользователя иско- мую сумму и количество монет. На выходе вы должны получить сообще- ние о том, можно или нет собрать введенную сумму при помощи заданно- го количества монет. Представьте, что для решения этой задачи в вашем распоряжении есть монеты номиналом 1, 5, 10 и 25 центов. Также ваша программа должна включать рекурсивный алгоритм. Циклов в ней быть не должно.
Упражнение 182. Слова через химические элементы
(67 строк)
Каждый химический элемент из таблицы Менделеева характеризуется своим обозначением, состоящим из одного, двух или трех символов. Есть такая игра – пытаться выразить то или иное слово через химические эле-


156
Упражнения менты. Например, слово silicon может быть записано при помощи следу- ющих химических элементов: Si, Li, C, O и N. В то же время слово hydrogen не может быть составлено из названий элементов.
Напишите рекурсивную функцию, способную определять, можно ли выразить переданное ей слово исключительно через обозначения хи- мических элементов. Ваша функция должна принимать два параметра: слово, которое нужно проверить, и список символов, которые можно при этом использовать. Возвращать функция должна строку, состоящую из использованных символов, если собрать искомое слово можно, и пустую строку в противном случае. При этом регистры символов учитываться не должны.
В основной программе должна быть использована ваша функция для проверки всех элементов таблицы Менделеева на возможность составить их названия из обозначений химических элементов. Отобразите на экра- не названия элементов вместе с обозначениями, которые были использо- ваны для их написания. Например, одна из строчек может выглядеть так:
Silver может быть представлен как SiLvEr
Для решения задачи вы можете воспользоваться набором данных с хи- мическими элементами, который можно скачать на сайте автора. Этот набор включает в себя названия и обозначения всех 118 элементов пе- риодической таблицы.
Упражнение 183. Последовательность химических
элементов
(Решено. 81 строка)
Существует такая игра, в которой химические элементы выстраиваются в длинную цепочку таким образом, чтобы каждое очередное слово на- чиналось на букву, на которую заканчивается предыдущее. Например, если последовательность начинается с элемента Hydrogen, то следующий элемент должен начинаться на N, и это может быть Nickel. Следом может идти Lithium. При этом элементы в ряду не должны повторяться. При игре в одиночку целью является составление списка элементов максимально возможной длины. Если в игре принимают участие двое, то целью стано- вится назвать такой химический элемент, чтобы оппонент не смог про- должить последовательность.
Напишите программу, которая будет запрашивать у пользователя химический элемент и при помощи рекурсивной функции определять максимально возможную последовательность слов. Выведите на экран полученный ряд. Удостоверьтесь, что программа выводит соответству- ющее сообщение об ошибке, если пользователь укажет несуществующий химический элемент.


Рекурсия

157
Подсказка. Для некоторых элементов вашей программе может понадобиться до двух минут, чтобы найти последовательность максимально возможной длины. Так что вам лучше начать проверку своей программы с элементов Molybdenum или Mag- nesium, для которых длина последовательности составляет всего восемь слов. На выполнение этой задачи уйдет всего несколько секунд.
Упражнение 184. Выравниваем список
(Решено. 33 строки)
Списки в языке Python могут содержать в себе вложенные списки. В то же время вложенные списки могут также состоять из списков, тем самым увеличивая глубину общей иерархии. В результате списки могут обретать структуру, похожую на следующую: [1, [2, 3], [4, [5, [6, 7]]], [[[8],
9], [10]]]
Списки со множеством уровней вложенности могут пригодиться при описании сложных отношений между элементами, но при этом такая структура значительно усложняет выполнение операций над элемен- тами.
Процесс выравнивания (flattening) списка заключается в избавлении от вложенной структуры и простом перечислении входящих в него элемен- тов. Допустим, для приведенного выше примера выровненный список будет выглядеть так: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. Для выполнения операции выравнивания списка data можно последовать следующему ал- горитму:
Если список data пуст, тогда
Возвращаем пустой список
Если первый элемент списка data также является списком, тогда
Выравниваем первый элемент списка data и присваиваем результат переменной l1
Выравниваем все элементы первого элемента списка data, за исключением первого, и присваиваем результат переменной l2
Возвращаем результат конкатенации списков l1 и l2
Если первый элемент списка data не является списком, тогда
Присваиваем переменной l1 список, состоящий из первого элемента списка data
Выравниваем все элементы первого элемента списка data, за исключением первого, и присваиваем результат переменной l2
Возвращаем результат конкатенации списков l1 и l2
Напишите функцию, реализующую рекурсивный алгоритм выравнива- ния списка, описанный выше. Функция должна принимать на вход список и возвращать выровненную версию списка. В основной программе про- демонстрируйте работу функции на примере приведенного выше списка, а также нескольких других.

158
Упражнения
Подсказка. В Python есть функция type, возвращающая тип данных своего един- ственного аргумента. Информацию о том, как узнать, является ли передаваемый ей аргумент списком, можно найти в интернете.
Упражнение 185. Декодирование на основе длин серий
(33 строки)
Кодирование на основе длин серий представляет собой простую технику сжатия информации, которая демонстрирует свою эффективность при на- личии множества соседствующих друг с другом повторяющихся значений.
Сжатие достигается за счет замены целой группы повторяющихся значе- ний на однократное его упоминание с отдельно хранящимся счетчиком повторов. Например, список ["A", "A", "A", "A", "A", "A", "A", "A", "A",
"A", "A", "A", "B", "B", "B", "B", "A", "A", "A", "A", "A", "A", "B"]
может быть закодирован в следующем виде: ["A", 12, "B", 4, "A", 6, "B", 1].
Процесс декодирования заключается в размножении каждого элемента в соответствии со счетчиком.
Напишите рекурсивную функцию для декодирования списка, коди- рованного на основе длин серий. В качестве единственного аргумента функция должна принимать закодированный соответствующим образом список. На выходе должен получиться расшифрованный список элемен- тов. В основной программе продемонстрируйте работу алгоритма деко- дирования на примере представленного здесь списка.
Упражнение 186. Кодирование на основе длин серий
(Решено. 38 строк)
Напишите рекурсивную функцию, реализующую алгоритм кодирования на основе длин серий, описанный в упражнении 185. На вход функции должен поступать список или строка, а на выходе будет закодированный список. В основной программе запросите у пользователя строку, сожми- те ее при помощи своей функции и отобразите на экране кодированный список.
Подсказка. Возможно, вам придется поместить цикл внутрь тела своей рекурсивной функции.


Часть
II
РЕШЕНИЯ

1   ...   6   7   8   9   10   11   12   13   14