You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python OOP实现岛屿计数时类内递归函数的正确写法咨询

岛屿问题OOP实现优化方案

核心疑问解答

  1. 是否应该通过实例属性访问row、col、grid?
    答案是肯定的,你已经在构造方法中将这三个值绑定为实例属性,完全不需要重复传参、重复实例化,直接通过self.xxx访问即可,既符合OOP封装原则,也能减少冗余代码。
  2. 类内部方法如何正确实现递归调用?
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:36:03