コードに問題はないと思っていましたが、値を変更し始めると、最終的に再帰の問題が発生しました。直したと思っていたのですが、結果を見てみると全部違っていました。ただし、再帰を維持すると結果は良好です。
while ループを使用して再帰の問題を修正しようとしました。ここでは、spread メソッドを再帰的に呼び出す代わりに、propagate メソッドに渡す値を返し、値が渡されない場合は False を返します。したがって、メソッドが値を返し続ける限り、前回の実行結果を使用してスプレッド メソッドを再実行する必要があります。
このコードは、再帰の制限を破るまで機能します。
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つはうまく機能します。もう 1 つは実際にはまったく機能しませんが、再帰エラーは発生しません。
なぜこれらは異なる値を返すのでしょうか?