递归调用发出后输出为空

2024-09-29 23:15:27 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的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
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]

Tags: inselftrueforlenreturnifdef
2条回答

你应该替换

self.finalResult.append(result)

self.finalResult.append(result[:])

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

您只有一个可以操作的列表result。当你附加时,你在列表中附加一个“引用”,然后你继续修改它。最后它是空的,所以你打印了92倍的空列表。您只需要在附加当前result之前创建它的副本。你知道吗

相关问题 更多 >

    热门问题