影响变量的递归函数
recursive function affecting variable
我有一个递归函数来计算 8 个皇后在 8x8 棋盘上不相交的方式的数量(对于 class)。它运作良好并提供正确的排列,当我让程序尝试计算答案的数量时,有趣的事情发生了 - 它不断 returns 我的计数器为零。当我手动计算排列时,它是 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)
问题是您永远不允许递归调用修改 count
的值。您将 count
值传递给函数,但是当调用 count = count + 1
行时,它只会修改 count
的 local 值该函数调用,并且不修改递归调用它的调用中的值。
以下修改工作正常(extend
的 return 值为 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))
我有一个递归函数来计算 8 个皇后在 8x8 棋盘上不相交的方式的数量(对于 class)。它运作良好并提供正确的排列,当我让程序尝试计算答案的数量时,有趣的事情发生了 - 它不断 returns 我的计数器为零。当我手动计算排列时,它是 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)
问题是您永远不允许递归调用修改 count
的值。您将 count
值传递给函数,但是当调用 count = count + 1
行时,它只会修改 count
的 local 值该函数调用,并且不修改递归调用它的调用中的值。
以下修改工作正常(extend
的 return 值为 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))