Предмет: Информатика, автор: arkadiychernikov002

Программирование Python
Нужно подробно объяснить принцип работы кода

Условие задачи
Рассмотрим слова из больших латинских букв и шаблоны, состоящие из больших латинских букв и символов «?» и «*».
Будем считать, что слово подходит под шаблон, если в шаблоне можно заменить каждый символ «?» на большую латинскую букву, а каждый символ «*» – на последовательность (возможно, пустую) больших латинских букв, так, чтобы получилось требуемое слово. Написать программу, определяющую, подходит ли слово под шаблон.
Входные данные - две строки: в одной строке записан шаблон – последовательность больших латинских букв, «?» и «*», в другой – слово, состоящее только из больших латинских букв. Обе строки не превышают 255 символов.
Выходные данные - необходимо вывести слово «YES», если слово подходит под шаблон и «NO» в противном случае.

Пример
Ввод:
ABBCDA
A*CDA
Вывод:
YES

Код

# Ввод данных
s = input("Слово: ")
p = input("Шаблон: ")

# match возвращает True, если подстрока s, начинающаяся с позиции spos,
# соответствует шаблону (подстрока p, которая начинается
# с позиции ppos)

def match(spos, ppos):
if (spos == len(s)) or (ppos == len(p)):
return (spos == len(s) and ppos == len(p))
elif p[ppos] == '?':
return match(spos + 1, ppos + 1)
elif p[ppos] == '*':
for i in range(spos, len(s)):
if match(i, ppos + 1):
return True
else:
return (s[spos] == p[ppos]) and (match(spos + 1, ppos + 1))
return False

if match(0, 0):
print('YES')
else:
print('NO')

Ответы

Автор ответа: perevernusb
1

Ответ:

Принцип работы рекурсивный

Объяснение:

# В комментариях я использовал слово итерация в значении запуска новой функции с данными spos/ppos большими на 1 (аналогично с циклом for

# Ввод данных

s = input("Слово: ")

p = input("Шаблон: ")

# match возвращает True, если подстрока s, начинающаяся с позиции spos,

# соответствует шаблону (подстрока p, которая начинается

# с позиции ppos)

def match(spos, ppos):

   if (spos == len(s)) or (ppos == len(p)):

       return (spos == len(s) and ppos == len(p)) #когда все символы слова либо шаблона пройдены возвращается True, если и шаблон и слово пройдены полностью, в другом случае возвращается False

   elif p[ppos] == '?':

       return match(spos + 1, ppos + 1) #когда встречается ? начинается новая итерация

   elif p[ppos] == '*': #проверка если подстрока - *

       for i in range(spos, len(s)): #обход всех оставшихся символов слова

           if match(i, ppos + 1):

               return True #если дочерняя функция (вызванная выше) выдала True, цикл for заканчивается досрочно, выдавая True

   else: #выполняется когда не встретилось */?

       return (s[spos] == p[ppos]) and (match(spos + 1, ppos + 1))# проверка на равентсво соответствующих (по индексу) символов слова и шаблона и запуск новой функции (итерации)

if match(0, 0):

   print('YES') #если результат функции True в консоль выводится 'YES', иначе 'NO'

else:

   print('NO')

Похожие вопросы
Предмет: Химия, автор: KUZNECHIK1
А1. Вещества, имеющие формулы СН3 – О – СН3 и СН3 – СН2 – ОН, являются 1) гомологами; 2) изомерами; 3) полимерами; 4) пептидами. А2. Продуктом гидратации этилена является: 1) спирт; 2)кислота; 3) альдегид; 4) алкан.
А3. Только в одну стадию может протекать гидрирование этого углеводорода: 1) бутадиен-1,3; 2) бутен-1; 3) бензол; 4) бутин-2.
А4. Количество атомов водорода в циклогексане: 1) 12; 2) 8; 3) 10; 4) 14.
А5. В промышленности ароматические углеводороды получают из… 1) природного газа; 2) нефти; 3) остатков горных пород; 4) торфа.
А6. Уксусная кислота не вступает во взаимодействие с веществом 1) оксид кальция 3) медь 2) метанол 4) пищевая сода
А7. Ацетилен принадлежит к гомологическому ряду: 1) алканов; 2) алкинов; 3) аренов; 4) алкенов
А8. Полипропилен получают из вещества, формула которого 1) СН2 = СН2; 2) СН ? СН; 3) СН3 – СН2 – СН3; 4) СН2 = СН – СН3.
А9. К ядовитым веществам относится: 1) метанол; 2) этанол; 3) пропанол; 4) бутанол.
А10. Фенол нельзя использовать для получения 1) красителей 3) пищевых добавок 2) капрона 4) взрывчатых веществ
А 11. Формалин – это водный раствор 1) уксусного альдегида 3) муравьиного альдегида 2) уксусной кислоты 4) этилового спирта