影响变量的递归函数

时间:2017-10-01 00:47:54

标签: python recursion counter

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

1 个答案:

答案 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))