@tisprk

Почему функция прерывает свое выполнение?

Всем привет!
Прохожу курс по python на stepik.org. Задачка по наследованию классов.
Суть: даются дети и их предки (класс и классы от которых идет наследование). Потом даются пары предок и потомок, например A B. Нужно ответить является ли А предком для B.

Вводные задачи:
4 #сколько будет передано строк говорящих кто от кого наследует
A #не наследует
B : A #В наследует от А
C : A
D : B C
1 #сколько будет передано пар для проверки
C D #является ли С предком D?

теперь то что я навоял:
def test_parent(par,ch):  #функция получающая предка и потомка для. Возвращает является ли предок потомку предком))
    # par - parent and ch - childe
    global dict_of_class
    if dict_of_class.get(ch) != 'None':
        for i in range(len(dict_of_class.get(ch))):
            print("-- "+dict_of_class.get(ch)[i])
            if dict_of_class.get(ch)[i] == par:
                return print('answer Yes')
            elif dict_of_class.get(dict_of_class.get(ch)[i]) == 'None':
                print('!!1!!')
            else:
                return test_parent(par,dict_of_class.get(ch)[i])

dict_of_class = {}

r1 = input()
for i in range(int(r1)):
    tmp = input().split()
    if len(tmp) >1:
        dict_of_class.update({tmp[0] : tmp[tmp.index(':')+1:]})
    else:
        dict_of_class.update({tmp[0] : 'None'})
r2 = input()
for i in range(int(r2)):
    tmp = input().split()
    print('')
    print('')
    print("childe " + tmp[1] + " :")
    if dict_of_class.get(tmp[1]) == 'None':
        if tmp[0] == tmp[1]:
            print('answer Yes')
        else:
            print('answer No')
    else:
        test_parent(tmp[0],tmp[1])


Получаю следующее:
childe D :
-- B
-- A

по идее, для потомка D, должен быть следующий проход: B,A,C
Если я правильно понял, mro() работает так:
classD(B, C):
    pass

Сначала он смотрит на B, потом на предков В, потом на С, потом на предков С.
Теперь вопрос:
Функция когда доходит до последнего предка В (это А) и видит что А не имеет предков, прерывает свое выполнение. Но по идее она должна прерывать себя и возвращаться к перебору предков D, то есть после места print('!!1!!'), функция должна прерваться и вернуться по рекурсии в саму себя же.
Почему?
PS спасибо всем кто дочитал))
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
@Drill
import re

dict_of_class = {}

for i in range(int(input())):
    child, *parents = re.findall(r"[\w]+", input())
    dict_of_class[child] = dict_of_class.get(child, []) + parents

print(dict_of_class)

def test_parent(child, parent):
    if child in dict_of_class:
        if parent in dict_of_class[child]:
            return True
        for par in dict_of_class[child]:
            child = par
            if test_parent(child, parent):
                return True
        return False
    else:
        return False

for i in range(int(input())):
    parent, child = input().split()
    print(('No', 'Yes')[test_parent(child, parent)])


In [8]:
4
A
B : A
C : A
D : B C
3
C D
A D
C A

{'A': [], 'B': ['A'], 'C': ['A'], 'D': ['B', 'C']}
Yes
Yes
No


UPD
Что касается Вашего решения:
Уберите return в последней строке Вашей функции test_parent(par,ch)

def test_parent(par,ch):  
.....
            else:
                test_parent(par,dict_of_class.get(ch)[i])
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы