使用递归算法时“记住”变量?

时间:2017-04-27 14:23:03

标签: python python-3.x dynamic-programming

我有这段代码:

another_list

其中condition是在其他地方定义的列表,我可以访问它。

当给定的排名符合某个another_list时,我会循环显示function而我正在添加排名,但当然每当我拨打new_listnew_list时重置并删除其中的所有值。

我希望new_pos包含所有function值,并且每次调用{{1}}时都不会重置,我只希望在我告诉它时将其清除。我该怎么做到这一点?

4 个答案:

答案 0 :(得分:2)

这通常通过向函数添加一个参数来保存“记住的”值并给它一个默认值来完成,因此不必将其提供给最高级别的调用。如果它是那种类型的函数(而不是仅为其副作用执行的函数),函数可以返回如下所示的值,如图所示。

def function(pos, new_list=None):
    if new_list is None:
        new_list = []

    if condition:
        for x in range(0,len(another_list)):
            new_pos = another_list[x]
            new_list.append(new_pos)
            function(new_pos, new_list)

    return new_list

# same usage
pos = 42
result_list = function(pos)

答案 1 :(得分:0)

我认为这可能对你有帮助。

def function(first_pos):

    def foo(pos):
        if condition:
            for x in range(0, len(another_list)):
                new_pos = another_list[x]
                new_list.append(new_pos)
                foo(new_pos)

    new_list = []
    foo(first_pos)
    return new_list

答案 2 :(得分:0)

如果您尝试累积每个函数调用的结果,可以将函数的最后一行更改为:

return new_list + function(new_pos)

然后,您还需要在return new_list不满意的情况下添加condition

这种性质的通用递归函数可能如下所示:

def generic_function(param):

    # break recursion when condition is not met
    if not condition:
        return []

    else:
        temporary_list = []
        # do stuff
        return temporary_list + generic_function(new_param)

这可能比尝试通过递归“记住”对象更好。如果事实证明确实有必要,请参阅解决该问题的martineau's answer

答案 3 :(得分:-1)

new_list=[]需要是函数中具有默认值的参数,因此您将其传递给下一个调用,但是当您第一次调用它时,它会默认为空列表