尽管堆栈测试为空,但递归功能仍然无法正常工作

时间:2019-10-05 13:50:11

标签: python recursion indexing range

我不知道为什么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:列表索引超出范围

我不明白为什么会发生此错误。我认为功能代码的第一行可以防止错误。

1 个答案:

答案 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]
>