#python #graph
Вопрос:
у меня есть список смежности, и я попытался выполнить итерацию по словарю, передав ключ в качестве параметра в словарь, а затем пытаясь выяснить, присутствовал ли определенный элемент в словаре(список смежности). Но этот код показывает ошибки. кто-нибудь может сказать мне, как это исправить? Код:
count = 0 def BackAndForth(AList,end1,end2): global count if(end2 in AList[end1]): count =1 for i in AList[end1]: if(i!=end2): BackAndForth(AList[i],i,end2) return count Alist = { 0 :[2, 3, 6], 1 :[3, 5 ,6] , 2 :[ 0 ,3 ,4], 3 :[ 0 ,1 ,2, 4], 4 : [2 ,3 ,5], 5 :[ 1 ,4 ,6], 6 :[ 0 ,1 ,5], } end1=0 end2=0 print(BackAndForth(Alist,end1,end2))
Комментарии:
1. Вы пытаетесь выполнить итерацию по чему-то целочисленному, но вам нужна возможность повторения (список, кортеж и т.д.). Этот ответ одновременно и правильный, и бесполезный. Вы должны спросить себя, почему у вас в этом месте целое число, а не повторяющееся, или, если целое число указано правильно, почему вы пытаетесь повторить его!
Ответ №1:
Ваша функция отлично работает при первом запуске, но обратите внимание, как вы рекурсивно переходите AList[I]
к BackAndForth
. В этот момент у вас есть массив, что звучит здорово, но у вас также есть это в вашем коде end2 in AList[end1])
, который даст вам int, а не список, который вы ожидали, как только он будет вызван рекурсивно. Ладно, ты решаешь просто передать Алисту. Теперь у вас другая проблема, она повторяется бесконечно. Так что теперь вы должны сказать ему остановиться, когда он найдет совпадение. Попробуйте следующее, это должно работать так, как вы ожидаете:
count = 0 def BackAndForth(AList,end1,end2): global count if(end2 in AList[end1]): count =1 return count for i in AList[end1]: if(i!=end2): BackAndForth(AList,i,end2) return count Alist = { 0 :[2, 3, 6], 1 :[3, 5 ,6] , 2 :[ 0 ,3 ,4], 3 :[ 0 ,1 ,2, 4], 4 : [2 ,3 ,5], 5 :[ 1 ,4 ,6], 6 :[ 0 ,1 ,5], } end1=0 end2=0 print(BackAndForth(Alist,end1,end2))
Ответ №2:
Спасибо, чувак, за твое объяснение. Как сказал u, функция рекурсирует бесконечно. После этого я попытался исправить это, добавив посещенный словарь, в котором узлы в качестве ключей и значений являются либо истинными, либо ложными в зависимости от статуса, посещен он или нет. Я даже добавил условие в инструкцию if(чтобы проверить, не посещен ли узел, а затем продолжить). Но, тем не менее, это повторяется бесконечно.Есть какие-нибудь советы, как это остановить?
count = 0 def BackAndForth(AList,end1,end2): global count visited={} for i in AList.keys(): visited[i] = False print(AList[end1]) visited[end1] = True if(end2 in AList[end1]): count =1 for i in AList[end1]: if(i!=end2 and not visited[i]): visited[i] = True BackAndForth(AList,i,end2) return count