类在递归函数中是如何工作的



我最近研究了DPLL问题,发现了一个有趣的情况。我不能很好地描述我的问题,但这里有一个例子来说明

第一个是一个没有类的递归函数

def test(my_list):
print(my_list)
variable1 = my_list[0]
variable2 = my_list[1]
variable3 = my_list[2]
if sum(my_list) == 13:
return True
elif sum(my_list) == 11 or sum(my_list) == 12:
return False
if test(my_list+[variable1]) or test(my_list+[variable2]) or test(my_list+[variable3]):
return True
else:
return False

test_list = [1, 2, 3, 4]
test(test_list)

结果是:

[1, 2, 3, 4]
[1, 2, 3, 4, 1]
[1, 2, 3, 4, 2]
[1, 2, 3, 4, 3]

因此,我们可以发现,如果函数返回false,这个函数会将列表转换为以前的形式。

第二个看起来是这样的:

class Formula(object):
def __init__(self, clauses):
self.clauses = clauses
def add(self, variable):
self.clauses.append(variable)
return self

def test(formula):
print(formula.clauses)
variable1 = formula.clauses[0]
variable2 = formula.clauses[1]
variable3 = formula.clauses[2]
if sum(formula.clauses) == 13:
return True
elif sum(formula.clauses) == 11 or sum(formula.clauses) == 12:
return False
if test(formula.add(variable1)) or test(formula.add(variable2)) or test(formula.add(variable3)):
return True
else:
return False

test_list = [1, 2, 3, 4]
my_formula = Formula(test_list)
test(my_formula)

这次的结果不同:

[1, 2, 3, 4]
[1, 2, 3, 4, 1]
[1, 2, 3, 4, 1, 2]

此函数不会将列表转换为前一种形式。

为什么会有这样的区别?

在第一个示例中,您执行my_list+[variable1],它创建了一个新列表,该列表是my_list[variable1]的串联。这也被称为";"不合时宜";添加这将创建列表的副本,该副本将传递给函数的下一次调用。

在第二个示例中,您将append添加到列表中(一个"就地"添加(。在这种情况下没有创建副本,并且在test([1, 2, 3, 4])的整个运行中只使用了一个列表对象

最新更新