【问题标题】:recursive function affecting variable影响变量的递归函数
【发布时间】:2017-10-01 00:47:54
【问题描述】:

我有一个递归函数来计算 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)

【问题讨论】:

  • 对,长度为 8 的排列被视为答案。所以每次它找到一个有 8 个皇后的解决方案时,它应该增加计数。最后的计数应该是可能的 8 个皇后的排列数,但由于某种原因,计数在每次迭代后都会返回 0。

标签: python recursion counter


【解决方案1】:

问题是您永远不允许递归调用修改count 的值。您将 count 值传递给函数,但是当调用 count = count + 1 行时,它仅修改该函数调用的 countlocal 值,而不修改递归调用它的调用中的值。

下面的修改就可以了(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))

【讨论】:

  • 谢谢!这真的让我很烦,所以没有将 count 变量传递回调用递归函数的函数。我对 perm 很幸运,因为它只能找到正向(将参数传递给函数)方向的排列。
猜你喜欢
  • 2021-01-17
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多