【问题标题】:How to store values globally in recursive calls in python如何在python的递归调用中全局存储值
【发布时间】:2021-12-07 19:57:35
【问题描述】:

我对 python 中的回溯方法有疑问。我如何存储变量和列表(临时),以便在 python 中递归的不同调用中形成,因为我们知道一旦形成的电源堆栈被破坏,变量的值也会被破坏。 例如:

avc=[]
var=0
def func(li,n,sumo,li2):
if sumo==n:
    global var
    var+=1
    #print(li2) ##line x
    adg(li2)
    return 
elif sumo>n:
    return 
else:
    for i in range(0,len(li)):
        li2.append(li[i])
        sumo=sum(li2)
        func(li,n,sumo,li2)
        li2.remove(li[i])

def adg(li3):
   global avc 
   avc.append(li3)
   #print("avc",avc)



if __name__=="__main__" :
   liq=list(map(int,input().strip().split()))
   n=liq[0]
   li=list(map(int,input().strip().split()))
   func(li,n,0,[])
   sumo=0
   count=0
   lis=[]
   j=0
   print(avc)

现在在第 x 行它会打印列表,但是当我在程序末尾打印 avc 时,它会打印空列表。我希望将元素附加到 avc 。 请帮忙。

【问题讨论】:

    标签: python python-3.x recursion dynamic-programming recursive-backtracking


    【解决方案1】:

    你应该改变

       avc.append(li3)
    

       avc.append(li3.copy())
    

    那是因为 avc 持有对 li3 的引用,并且通过这样做

     li2.remove(li[i])
    

    您也从 li3 中删除了项目,因为您将 li2 传递给了名为 li3 的 adg。

    通过在 li3 上调用 .copy(),您会得到一个包含相同元素的新列表,因此当您更改 li2(或 li3)时,复制的列表不会改变。

    【讨论】:

    • @Rahul 没问题。你应该把它标记为已解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 2015-04-23
    • 1970-01-01
    • 2019-06-19
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多