尝试对迷宫问题使用递归,并制作了一个条件测试用例。有人能向我解释为什么第二个条件增加了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
的调用中"正在";在";这从附加a
s切换到附加b
s;out";这些调用仍在继续,并且由于count
在该调用中被重置为0,因此现在再次为0
,而status
类似于1
,因此再次进入b
附加分支。
然而,还有一个更复杂的问题:在您的代码中,在递归调用中对count
和status
的重新分配对当前调用并不重要,但.append
对list1
的重新分配是,因为它是相同的列表对象正在被修改。
即使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。