如何在递归中使用字典

时间:2016-07-28 18:49:07

标签: python dictionary recursion copy

我有一个递归函数,类似于图G =(V,E)上的DFS,它找到所有简单路径。递归是在for循环中,因此当函数返回时,它可以在返回之前再次递归。

只是设置图片:

def algo(M,v):
    for u in v.neighbors:
        # do stuff
        M[u.name] = u     # dictionary
        algo(M,u)

然而,由于M是一个字典,它被视为一个可变对象,因此当函数返回时它不会像对待不可变对象那样恢复M.什么是最好的pythonic方式来实现这个?

我认为副本库中的deepcopy函数不是最佳选择,因为文档中列出了导致递归循环的问题:https://docs.python.org/2/library/copy.html

如何做到这一点?

1 个答案:

答案 0 :(得分:1)

您只是想将项目插入字典,重复,然后删除项目:

def algo(M, v):
    for u in v.neighbors:
        # do stuff
        M[u.name] = u  # temporarily extend dictionary
        result = algo(M, u)
        del M[u.name]  # clean up
        # check result

如果你想确保字典对于下一次迭代和recurance是原始的,你可以传递一个增强(浅)副本:

def algo(M, v):
    for u in v.neighbors:
        # do stuff
        # create a new extended dictionary on the fly
        result = algo({**M, u.name: u}, u))
        # no need to clean up afterwards
        # check result

如果您没有运行Python 3.5或更高版本,请使用更详细的语法,例如:

def algo(M, v):
    for u in v.neighbors:
        # do stuff
        # create a new extended dictionary on the fly
        result = algo(dict(list(M.items()) + [(u.name, u)]), u))
        # no need to clean up afterwards
        # check result

或者你想要实现其他目标吗?