修复Python递归会导致错误的结果

时间:2013-05-06 10:21:01

标签: python

我认为我的代码没有任何问题,但是当我开始更改值时,我最终遇到了递归问题。我以为我修好了,但是当我看到结果时,他们都错了。当我保持递归时,结果很好。

我使用了一个while循环来尝试修复递归问题,而不是递归地调用spread方法,我将传递给它的值传递给propagate方法,如果它不传递值,则返回False 。因此,只要该方法保持返回值,就应该使用前一次运行的结果重新运行spread方法。

此代码一直有效,直到它破坏了递归限制:

    def spread(self, position):
        for direction in self._directions:
            (x, y) = self.changePosition(position, direction)
            if self.canInfectMatrix[x][y] and not self.contactMatrix[x][y]:
                self.contactMatrix[x][y] = True
                self.spread([x,y])
#                 return [x,y]
#             return False

    def propagate(self):
        # initialize canInfectMatrix and contactMatrix
        self.contactMatrix = [[False for row in range(self.cardinalWidth)] for col in range(self.cardinalWidth)]
        self.canInfectMatrix = [[False for row in range(self.cardinalWidth)] for col in range(self.cardinalWidth)]
        for col in range(self.cardinalWidth):
            for row in range(self.cardinalWidth):
                self.canInfectMatrix[row][col] = self.getsInfected(self._matrix[col][row])
        # Spread infection.
        for x in range(self.cardinalWidth):
            for y in range(self.cardinalWidth):
                if self._matrix[x][y] == "infected":
                    self.spread([x,y])
#                     position = [x,y]
#                     while position:
#                         position = self.spread(position)

以下代码不起作用,但我没有错误:

    def spread(self, position):
        for direction in self._directions:
            (x, y) = self.changePosition(position, direction)
            if self.canInfectMatrix[x][y] and not self.contactMatrix[x][y]:
                self.contactMatrix[x][y] = True
#                self.spread([x,y])
                 return [x,y]
             return False

    def propagate(self):
        # initialize canInfectMatrix and contactMatrix
        self.contactMatrix = [[False for row in range(self.cardinalWidth)] for col in range(self.cardinalWidth)]
        self.canInfectMatrix = [[False for row in range(self.cardinalWidth)] for col in range(self.cardinalWidth)]
        for col in range(self.cardinalWidth):
            for row in range(self.cardinalWidth):
                self.canInfectMatrix[row][col] = self.getsInfected(self._matrix[col][row])
        # Spread infection.
        for x in range(self.cardinalWidth):
            for y in range(self.cardinalWidth):
                if self._matrix[x][y] == "infected":
#                    self.spread([x,y])
                     position = [x,y]
                     while position:
                         position = self.spread(position)

注意每种方法底部的评论更改

据我所知,这两者都应该完成同样的事情,但事实并非如此。一个工作得很好,直到我得到递归限制错误。另一个根本不起作用,但我没有得到递归错误。

为什么这些会返回不同的值?

1 个答案:

答案 0 :(得分:1)

在您的第二个版本中,您在return循环中使用for语句。当然,这样的返回会中断for循环,这将永远不会恢复。

你想要的是调用spread()来返回一个可能为空的点列表。然后在调用者中,将这些新答案附加到待处理点列表中。调用者可以通过重复弹出该列表中的项目,调用spread(),并将所有新点附加到列表中 - 然后重复直到列表为空来工作。