Рекурсія
Рекурсія
Одним з важливих понять, які використовуються в теорії алгоритмів, є рекурсія. Неформально її можна визначити як використання в опису об'єкту самого себе. Якщо мова йде про процедуру, то в процесі виконання ця процедура напряму чи опосердковано (через інші процедури) викликає сама себе.
Рекурсія є дуже «потужним» методом побудови алгоритмів, але ховає у собі деякі небезпеки. Наприклад, неакуратно написана рекурсивна процедура може ввійти в нескінчену рекурсію, тобто ніколи не завершить своє виконання (насправді виконання завершиться з переповненням стеку).
Оскільки рекурсія може бути опосередкованою (процедура викликає сама себе через інші процедури), то задача визначення факту, чи є конкретна процедура рекурсивною, може бути достатньо складною.
Розглянемо програму, яка містить n процедур P1
, P2
, ..., Pn
. Нехай для кожної процедури відомі процедури, які вона може викликати. Процедура P називається потенційно рекурсивною, якщо існує така послідовність процедур Q0
, Q1
, ..., Qk
, що Q0
= Qk
= P і для i = 1 ... k процедура Qi-1
може викликати процедуру Qi
.
Потрібно написати програму, яка визначить для кожної з заданих процедур, чи є вона потенційно рекурсивною.
Вхідні дані
Перший рядок містить кількість процедур n (1 ≤ n ≤ 100) в програмі. Далі йде n блоків, які описують процедури. Блоки відокремлено один від одного рядками, кожен з яких містить по 5 символів "*" (зірочка).
Опис процедури починається з рядка, що містить її ідентифікатор, який складається лише з маленьких букв латинського алфавіту та цифр. Ідентифікатор може починатись як з букви, так і з цифри. Довжина ідентифікатора від 1 до 100 символів. Далі йде рядок, який містить число k (k ≤ n) - кількість процедур, які можуть бути викликані процедурою, шо описується. Наступні k рядків містять ідентифікатори цих процедур - по одному ідентифікатору у рядку.
Різні процедури мають різні ідентифікатори. При цьому жодна процедура не може викликати процедуру, яку не описано у вході.
Вихідні дані
Для кожної процедури, присутньої у вході, у порядку, в якому вони перераховані у вході, необхідно вивести в окремому рядку назву процедури, потім двокрапку, пропуск, потім слово YES, якщо процедура є потенційно рекурсивною, або слово NO у протилежному випадку.
3 p1 2 p1 p2 ***** p2 1 p1 ***** p3 1 p1
p1: YES p2: YES p3: NO