Python OOP实现岛屿计数时类内递归函数的正确写法咨询
岛屿问题OOP实现优化方案
核心疑问解答
- 是否应该通过实例属性访问row、col、grid?
答案是肯定的,你已经在构造方法中将这三个值绑定为实例属性,完全不需要重复传参、重复实例化,直接通过self.xxx访问即可,既符合OOP封装原则,也能减少冗余代码。 - 类内部方法如何正确实现递归调用?
在Python的类实例方法中,第一个参数self就代表当前实例本身,你要调用同一个实例的其他方法(包括递归调用自身),直接用self.方法名(参数)即可,完全不需要重复创建Solution实例。
原代码存在的问题
- dfs方法冗余传入grid参数,同时错误直接访问全局作用域的row、col变量,没有使用实例属性
- 递归调用时重复创建Solution实例,产生不必要的性能开销,写法冗余
- Islands方法同样错误访问全局变量,调用dfs时重复实例化
优化后完整代码
class Solution : # 构造方法:将网格相关公共属性绑定到实例 def __init__(self, row, col, grid): self.row = row self.col = col self.grid = grid # 深度优先搜索,仅需传入当前坐标x、y即可 def depthFirstSearch(self, x , y): # 边界判断直接使用实例属性 if x < 0 or y < 0 or x >= self.row or y >= self.col or self.grid[x][y] == 0 : return # 标记当前单元格为已访问(沉岛) self.grid[x][y] = 0 # 递归调用直接通过self调用自身方法,无需重复实例化 self.depthFirstSearch(x + 1 , y) self.depthFirstSearch(x - 1 , y) self.depthFirstSearch(x , y + 1) self.depthFirstSearch(x , y - 1) return def Islands (self) : islands = 0 # 边界判断使用实例属性 if not self.grid : return 0 # 遍历网格使用实例属性 for x in range(self.row) : for y in range(self.col) : if self.grid[x][y] == 1 : # 直接调用当前实例的dfs方法 self.depthFirstSearch(x, y) islands += 1 return islands if __name__ == '__main__': grid = [[1, 1, 1], [1, 0, 0], [1, 0, 1 ], [0, 1, 0]] row = len(grid) col = len(grid[0]) s = Solution(row, col, grid) ans = s.Islands() print('Number of Islands : {0}'.format(ans))
优化效果
- 代码冗余度大幅降低,没有重复的参数传递和实例创建
- 所有网格相关属性封装在实例内部,避免了全局变量访问的风险
- 运行测试用例输出结果为
3,符合预期计算结果
内容的提问来源于stack exchange,提问作者Scottish Smile
相关产品推荐
相关产品推荐

