2013-05-06 64 views
0

我認爲我的代碼沒有問題,但是當我開始更改值時,最終導致了遞歸問題。我以爲我修好了它,但是當我看到結果時,他們都是錯的。當我保持遞歸時,結果很好。修復Python遞歸會導致錯誤的結果

我使用了一個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

在第二個版本中,您在for循環中使用return語句。這樣的返回會中斷for循環,當然,這將永遠不會恢復。

你想要的是撥打spread()返回一個可能爲空的點列表。然後在調用者中將這些新答案附加到待處理點的列表中。調用者可以通過反覆從該列表中彈出一個項目進行工作,調用spread(),並將所有新的點添加到列表中 - 並重復,直到列表爲空。

+0

甜。謝謝。這恰恰是錯誤的,你的解決方案非常合理。 – 2013-05-06 12:28:22