我有一个递归函数,类似于图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
如何做到这一点?
答案 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
或者你想要实现其他目标吗?