我有一个递归函数来计算8个皇后棋盘可以放在8x8棋盘上的方式,而不会相互交叉(对于一个类)。它运行良好并给出正确的排列,有趣的事情发生在我让程序尝试计算答案的数量时 - 它会不断地将我的计数器返回到零。当我手动计算它的排列时它是92(这是正确的)。
def can_be_extended_to_solution(perm):
i = len(perm) - 1
for j in range(i):
if i - j == abs(perm[i] - perm[j]):
return False
return True
def extend(perm,count, n):
if len(perm)==n:
count=count+1
print "cycle counter= ",count
print(perm)
for k in range(n):
if k not in perm:
perm.append(k)
if can_be_extended_to_solution(perm): # if it works
extend(perm, count, n)
perm.pop()
extend(perm = [], count=0, n = 8)
答案 0 :(得分:2)
问题是你永远不允许递归调用来修改count
的值。您将count
值传递给函数,但是当调用count = count + 1
行时,它仅修改该函数调用的{em> local 值count
,并且不会修改递归调用它的调用中的值。
以下修改工作正常(extend
的返回值为92)。
def can_be_extended_to_solution(perm):
i = len(perm) - 1
for j in range(i):
if i - j == abs(perm[i] - perm[j]):
return False
return True
def extend(perm, count, n):
if len(perm) == n:
count = count + 1
print("cycle counter= " + str(count))
print(perm)
for k in range(n):
if k not in perm:
perm.append(k)
if can_be_extended_to_solution(perm): # if it works
count = extend(perm, count, n)
perm.pop()
return count
print(extend(perm=[], count=0, n=8))