为什么这个递归函数中的第二个条件出现两次



尝试对迷宫问题使用递归,并制作了一个条件测试用例。有人能向我解释为什么第二个条件增加了20个bs而不是10个吗?

def recur_test(count, list1, status):
if count == 10 and status == 1:
return (count, list1)
if count == 10 and status == 0:
count = 0
status = 1
recur_test(count, list1, status)
if count < 10 and status == 0:
count += 1
list1.append("a")
print("A thread", count)
recur_test(count, list1, status)
if count < 10 and status == 1:
count += 1
list1.append('b')
print("B Thread", count)
recur_test(count, list1, status)
print(recur_test(0, [], 0))

考虑一个更简单的例子:

def recur_test(value):
if value:
print("in first condition")
recur_test(False)
if not value:
print("in second condition")
recur_test(True)

最容易理解这一点的方法是替换另一个做同样事情的函数,并调用它,而不是进行递归调用:

def recur_test_2(value):
if value:
print("in first condition")
value = False
recur_test_2(value)
if not value:
print("in second condition")
def recur_test_1(value):
if value:
print("in first condition")
value = False
recur_test_2(value)
if not value:
print("in second condition")
recur_test_1(True)

现在应该没有混淆:当对recur_test_2的调用返回时,recur_test_1继续进行,并第二次打印in second condition消息——因为value已经更改。

递归也会发生同样的基本情况——对函数的每次调用都是"0";"分离";,恰好函数每次都有相同的名称

您自己的代码也有同样的问题——在count == 10 and status == 0的调用中,也就是您将status翻转为1的调用中"正在";在";这从附加as切换到附加bs;out";这些调用仍在继续,并且由于count在该调用中被重置为0,因此现在再次为0,而status类似于1,因此再次进入b附加分支。

然而,还有一个更复杂的问题:在您的代码中,在递归调用中对countstatus的重新分配对当前调用并不重要,但.appendlist1的重新分配是,因为它是相同的列表对象正在被修改。

即使if语句为true,它也会意外地传递给其他语句。当第二个条件if count == 10 and status == 0:为true时,您将count设置为0,status设置为1,然后进行递归调用。递归调用一直通过";B线程";并将控制返回到您在第二个if主体中进行递归调用的位置。所以现在count和status分别为0和1。这使得最后一个条件if count < 10 and status == 1:为真,因此它继续一直通过"0";B线程";再一次

我建议将if语句改为if else。

最新更新