我不知道为什么if len(stack)==0: return 0
行不起作用。
图形列表的元素表示节点,例如:[2, 6]
表示值为2的节点->值为6的节点,类似地,值为4的节点连接到值为7、8、9的节点(三个后代节点)。
我想知道从goal[0]
到goal[1]
的路线是否存在。
在我的示例中,没有路线。
graph_list=[[2, 6], [4, 7], [5, 7], [1, 5], [2, 9], [4, 9], [4, 8], [5, 3], [7, 8]]
goal=[1, 9]
stack=[goal[0],]
def check_func(d_list, goal):
if len(stack)==0:
return 0
for node in d_list:
if node[0]==stack[-1]:
stack.append(node[1])
d_list.remove(node)
check_func(d_list, goal)
if stack[-1]==goal[1]:
return 1
else:
stack.pop(-1)
print(stack)
check_func(d_list, goal)
经过一些迭代,在下一行,发生错误。
如果堆栈[-1] ==目标[1]:
IndexError:列表索引超出范围
我不明白为什么会发生此错误。我认为功能代码的第一行可以防止错误。
答案 0 :(得分:1)
我看到您的代码有几个问题:
递归初学者的常见错误:您的check_func()
返回
一个值,但是当您递归调用它时,您将忽略返回的值
值!
以循环的方式从d_list
中删除项目
d_list
通常是个坏主意。而且,在这种情况下,这是不必要的。
您尝试删除的附加到堆栈逻辑的操作存在缺陷,因为您没有删除 有关递归失败的附加项目,请继续测试。
您的示例graph_list
永远不会成功实现目标[1, 9]
-
有用的测试用例,但对开发不利。尝试一个目标
的[1, 8]
。
下面是我对代码的重做,看看它的行为是否更符合您的期望:
def check_func(d_list, goal):
if not stack:
return False
if goal[1] == stack[-1]:
return True
for node in d_list:
if node[0] == stack[-1]:
stack.append(node[1])
if check_func(d_list, goal):
return True
stack.pop()
return False
graph_list = [[2, 6], [4, 7], [5, 7], [1, 5], [2, 9], [4, 9], [4, 8], [5, 3], [7, 8]]
goal = [1, 8]
stack = [goal[0]]
if check_func(graph_list, goal):
print(stack)
输出
> python3 test.py
[1, 5, 7, 8]
>