0

コードに問題はないと思っていましたが、値を変更し始めると、最終的に再帰の問題が発生しました。直したと思っていたのですが、結果を見てみると全部違っていました。ただし、再帰を維持すると結果は良好です。

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 つは実際にはまったく機能しませんが、再帰エラーは発生しません。

なぜこれらは異なる値を返すのでしょうか?

4

1 に答える 1

1

2 番目のバージョンでは、ループ内returnでステートメントを使用しています。forもちろん、そのようなリターンは for ループを中断し、再開されることはありません。

spread()代わりに、空のポイントのリストを返す呼び出しを行う必要があります。次に、呼び出し元で、これらの新しい回答を処理対象のポイントのリストに追加します。呼び出し元は、そのリストからアイテムを繰り返しポップし、 を呼び出しspread()、取得したすべての新しいポイントをリストに追加し、リストが空になるまで繰り返します。

于 2013-05-06T11:15:34.833 に答える