[英]Backtracking in Python
我刚开始学习Python并尝试写下回溯算法,但是看来我做错了。 由于我是这种语言的新手,所以我一直试图在Internet上查找它,但对它的了解不是很多,这是我的代码:
n = 3
x = [0] * 3
k = 0
def init ():
x[k] = 0
def succesor():
if x[k] < n:
x[k]+=1
return 1
return 0
def valid ():
i = 1
for i in range (0,k-1):
if x[i] == x[k]:
return 0
return 1
def solutie ():
return k == n
def afis():
print(x)
def back ():
k = 1
avemsuccesor = 1
init()
while k > 0:
while avemsuccesor and not valid():
avemsuccesor = succesor()
if avemsuccesor:
if solutie:
afis()
else:
k+=1
init()
else:
k-=1
def main ():
back()
main ()
运行它时,我只会得到一个全为0的向量。 你能帮我吗 ?
一个关键问题是:
if solutie:
正在测试函数的真实性,该真实性将始终为True
:
>>> bool(solutie)
True
而不是它返回的价值的真实性; 你应该有:
if solutie():
# ^ note parentheses
另外,您的函数都没有参数,因此您完全依赖变量作用域进行访问。 这是不明智的,并且使代码非常难以调试-您无法单独测试任何功能。 举个简单的例子,比较一下:
def solutie():
return k == n
同
def solutie(k, n):
return k == n
对于前者,测试非常困难k
和n
什么? 他们来自哪里? 对于后者,这很简单
assert solutie(1, 1)
assert not solutie(1, 2)
您遇到的主要问题是 : k
是不可变的,因此除back
之外,每个函数中始终使用相同的值 。 尽管您在back
分配了k += 1
,但其他函数(例如valid
)仍在外部范围中使用k == 0
。 如果更改每个函数以使用显式参数并返回值,例如:
def successor(x, k, n):
...
return True # use booleans rather than 0 or 1
...
avemsuccesor = succesor(x, k, n)
您会很快发现k
超出范围,从而导致IndexError
。 我不会在这里重写所有内容-我将保留重构代码以显式传递值的方式,并解决错误,然后为您做练习。
问题在于,k被定义了两次,一次是0,一次是1。在有效内部,它选择全局k = 0,但是不管k-1最初是零,所以valid()在第一次迭代中将返回1。 我不理解该程序的意图,但这就是它永远无法运行后继者()的原因,后者实际上是将向量的元素从零修改为零。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.