我认为我的代码没有任何问题,但是当我开始更改值时,我最终遇到了递归问题。我以为我修好了,但是当我看到结果时,他们都错了。当我保持递归时,结果很好。
我使用了一个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)
注意每种方法底部的评论更改
据我所知,这两者都应该完成同样的事情,但事实并非如此。一个工作得很好,直到我得到递归限制错误。另一个根本不起作用,但我没有得到递归错误。
为什么这些会返回不同的值?
答案 0 :(得分:1)
在您的第二个版本中,您在return
循环中使用for
语句。当然,这样的返回会中断for循环,这将永远不会恢复。
你想要的是调用spread()
来返回一个可能为空的点列表。然后在调用者中,将这些新答案附加到待处理点列表中。调用者可以通过重复弹出该列表中的项目,调用spread()
,并将所有新点附加到列表中 - 然后重复直到列表为空来工作。