#python #recursion
#python #рекурсия
Вопрос:
G = [[0, 1, 1, 0, 0], [1, 0, 1, 1, 0], [1, 1, 0, 0, 1], [0, 1, 0, 0, 1], [0, 0, 1, 1, 0]]
def IsDominate(A, S, v):
for i in range(0, len(A)):
vert = S[i]
if (A[vert][v] == 1):
return True
return False
print(IsDominate(G, [0, 3, 2], 1))
В основном функция принимает в качестве входных данных матрицу смежности A графа G, подмножество S его вершин и вершину v. Функция возвращает true, если S доминирует над v и false в противном случае.
Вот мой неправильный код, использующий рекурсию:
def ISDominate(A, S, v, i):
if i == 0:
return A[0]
vert = S[i]
if (A[vert][v] == 1):
return True
return IsDominate(A,S, v, i-1)
print(ISDominate(G, [0, 2, 3], 1, len(G)-1))
Комментарии:
1. вы смотрели на numpy? или вы действительно хотите сделать это самостоятельно?
2. @user3732793 Нет, я не смотрел на Numpy
Ответ №1:
Прежде всего, ваш код выдает ошибку IndexError при задании этого графика смежности:
G = [[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 1, 1, 0]]
Это потому, что длина S меньше длины G. Когда он не может вернуть True, он в конечном итоге выходит за пределы индекса.
Чтобы сделать ваш код рекурсивным, вы можете сделать это:
G = [[0, 1, 1, 0, 0],
[1, 0, 1, 1, 0],
[1, 1, 0, 0, 1],
[0, 1, 0, 0, 1],
[0, 0, 1, 1, 0]]
def IsDominate(A, S, v):
if A[S[0]][v] == 1:
return True
return IsDominate(A,S[1:],v) if S[1:] else False
print(IsDominate(G, [0, 3, 2], 1))
В основном проверьте первую запись и вызовите функцию рекурсивно без первой записи S. Я не рекомендую использовать рекурсию здесь, на мой взгляд, это не добавляет эффективности или удобочитаемости.