递归调用问题后的空输出

时间:2015-11-03 06:25:29

标签: python algorithm

这是我的8皇后问题的代码以及为什么我的输出都是空列表([])?

我已检查此声明print "result ok", result将获得非空结果。

class Solution(object):

    def __init__(self, finalResult):
        self.finalResult = finalResult

    def Valid(self,result):
        currentX = len(result) - 1
        currentY = result[-1]
        if currentX == 0:
            return True
        for i in range(0, len(result) - 1):
            if result[i] == currentY:
                return False
            elif abs(i - currentX) == abs(result[i] - currentY):
                return False
        return True

    def NQueens(self, result):
        if result == []:
            row = 0
        else:
            row = len(result)
        for col in range(0, 8):
            result.append(col)
            if self.Valid(result) == True:
                # print "check valid ok", row, col, result
                if row == 7:
                    # print "result ok", result
                    self.finalResult.append(result)
                else:
                    self.NQueens(result)
            result.pop(-1)

        return
if __name__ == "__main__":
    finalResult = []
    s = Solution(finalResult)
    s.NQueens([])

    print len(s.finalResult)

    for i in s.finalResult:
        print i

输出,

92
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]

2 个答案:

答案 0 :(得分:3)

你应该替换

andBegin

self.finalResult.append(result)

这将创建"结果"的副本。您当前的代码正在创建多个对同一结果的引用,这些引用都会被result.pop(-1)

清空

答案 1 :(得分:2)

您只有一个操作列表result。当你追加时,你将一个'引用'附加到该列表,然后你继续修改它。最后它是空的,所以你打印92次空列表。您只需要在添加之前创建当前result的副本。