Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的python变量在递归过程中全局运行?_Python_Variables_Recursion - Fatal编程技术网

为什么我的python变量在递归过程中全局运行?

为什么我的python变量在递归过程中全局运行?,python,variables,recursion,Python,Variables,Recursion,我有一个递归函数,它不能按我希望的方式工作。在函数内部,我有一个名为sum的变量。我希望每个函数调用的变量都是局部变量/不同的变量,以便最终的和成为所有早期函数调用的和。但是,似乎变量是全局作用的,因此每次调用函数时,sum变量都设置为0,这就是最终返回的结果。我对列表也有同样的问题:对于每个函数调用,在所有不同的递归帧中从我的_列表中删除一个元素,而不仅仅是我希望的本地帧。这就是python中递归期间变量的工作方式吗?如果是,我如何更改代码以使其按我希望的方式工作 顺便说一句,函数的目的是找出

我有一个递归函数,它不能按我希望的方式工作。在函数内部,我有一个名为sum的变量。我希望每个函数调用的变量都是局部变量/不同的变量,以便最终的和成为所有早期函数调用的和。但是,似乎变量是全局作用的,因此每次调用函数时,sum变量都设置为0,这就是最终返回的结果。我对列表也有同样的问题:对于每个函数调用,在所有不同的递归帧中从我的_列表中删除一个元素,而不仅仅是我希望的本地帧。这就是python中递归期间变量的工作方式吗?如果是,我如何更改代码以使其按我希望的方式工作

顺便说一句,函数的目的是找出列表中是否存在一个子集,该子集与数字n相加,但这与理解我遇到的问题不太相关

我搜索过类似的帖子,发现有人认为除非使用return语句返回函数,否则不会调用递归,如下所示:

返回f(n-x,删除(列表,x))

然而,如果是这样的话,我不知道如何既返回函数又同时向求和中添加值

list1 = [3, 5, 1, 2, 5, 3, 4]

# removes an element from the list, and returns the result
def remove(list_, x):
    list_.remove(x)
    return list_

# recursive function
# should return 1 or more if there exists a combination of numbers in the list
# that add up to the number n
def f(n, my_list):
    sum = 0

    if n == 0:
        return 1
    if len(my_list) == 0:
        return 0
    for x in my_list:
        sum += f(n - x, remove(my_list, x))

    return sum


print(f(15, list1))

列表中存在一个子集,其总和为15:例如(5,1,5,4),因此输出应至少为1,但由于变量是全局作用的,因此输出始终为0。

仅创建一个列表对象,因此当删除元素时,所有元素都将被删除。您需要先复制列表,然后再将其传递下去。试试这个:

list1=[3,5,1,2,5,3,4]
#从列表中删除元素,并返回结果
def移除(列表_ux):
列表删除(x)
返回列表_
#递归函数
#如果列表中存在数字组合,则应返回1或更多
#那加起来就是n
def f(n,我的清单):
总和=0
如果n==0:
返回1
如果len(my_list)==0:
返回0
对于my_列表中的x:
sum+=f(n-x,remove(list(my_list),x))
回报金额
印刷品(f(15,清单1))

只创建了一个列表对象,因此当删除元素时,列表对象将被删除到所有位置。您需要先复制列表,然后再将其传递下去。试试这个:

list1=[3,5,1,2,5,3,4]
#从列表中删除元素,并返回结果
def移除(列表_ux):
列表删除(x)
返回列表_
#递归函数
#如果列表中存在数字组合,则应返回1或更多
#那加起来就是n
def f(n,我的清单):
总和=0
如果n==0:
返回1
如果len(my_list)==0:
返回0
对于my_列表中的x:
sum+=f(n-x,remove(list(my_list),x))
回报金额
印刷品(f(15,清单1))
您的代码不能使用递归算法,我将代码更新为递归


您的代码没有使用递归算法,我将代码更新为递归。

sum
是一个
int
;这是不可变的——在例程的每个条目上都有一个局部变量

但是,
my_list
是函数的可变参数;所有调用共享同一对象。与其传递列表,不如传递截断列表的副本。通过切片,您可以更轻松地执行此操作。尝试类似于这个问题的在线解决方案:在每个递归步骤中,前进一个分支,包括lead元素;在没有它的情况下,在另一方面取得进展

def f(n, my_list):
    if n == 0:
        return True
    if len(my_list) == 0:
        return False
    if f(n, my_list[1:]):
        return True
    if f(n - my_list[0], my_list[1:])
        return True

    return False

sum
是一个
int
;这是不可变的——在例程的每个条目上都有一个局部变量

但是,
my_list
是函数的可变参数;所有调用共享同一对象。与其传递列表,不如传递截断列表的副本。通过切片,您可以更轻松地执行此操作。尝试类似于这个问题的在线解决方案:在每个递归步骤中,前进一个分支,包括lead元素;在没有它的情况下,在另一方面取得进展

def f(n, my_list):
    if n == 0:
        return True
    if len(my_list) == 0:
        return False
    if f(n, my_list[1:]):
        return True
    if f(n - my_list[0], my_list[1:])
        return True

    return False

列表中x的
是怎么回事?不要使用保留字。关键字
sum
也一样。这些都是保留的功能。如果它们很难知道它们是否取决于您编写代码的位置,请使用诸如VSCode或Pycharm之类的IDE。我也喜欢使用ipython编写脚本。没错,最后忘了添加u,就像我在删除函数中添加list u一样。list中x的
怎么了?不要使用保留字。关键字
sum
也一样。这些都是保留的功能。如果它们很难知道它们是否取决于您编写代码的位置,请使用诸如VSCode或Pycharm之类的IDE。我也喜欢使用ipython编写脚本。没错,最后忘记添加u,就像我在删除函数中添加列表一样谢谢!它现在的工作方式非常好:)谢谢!它现在的工作方式非常好:)