类形式的简单DFS代码运行异常,函数形式正常,求原因
类形式DFS路径计数错误原因及修复
问题情况
函数形式的DFS代码调用dfs(2,1)能得到正确结果3,但改成类形式后,调用Solution().uniquePaths(3,2)返回0,不符合预期。
函数形式代码
k = 0 def dfs(m, n): global k if (m == 0) or (n == 0): k += 1 return else: dfs(m - 1, n) dfs(m, n - 1) dfs(2,1) # Result : 3
类形式代码(存在问题)
class Solution(object): def uniquePaths(self, m, n): """ :type m: int :type n: int :rtype: int """ self.path = 0 self.dfs(m - 1, n - 1) return self.path def dfs(self, m, n): if (m == 0) or (n == 0): self.path += 1 return else: dfs(m - 1, n) dfs(m, n - 1) ans = Solution().uniquePaths(3, 2) print(ans) # Result : 0
错误原因
类中dfs方法的递归调用存在问题:在else分支里直接写dfs(m-1, n),这会优先调用全局的dfs函数(如果之前运行过函数式代码),而不是当前类实例的self.dfs方法。全局dfs修改的是全局变量k,完全不会影响类实例的self.path,导致最终self.path始终是初始值0。如果没有全局dfs,这里会直接抛出NameError,提示找不到dfs名称。
修复后的代码
把递归调用改为调用当前实例的self.dfs方法即可:
class Solution(object): def uniquePaths(self, m, n): """ :type m: int :type n: int :rtype: int """ self.path = 0 self.dfs(m - 1, n - 1) return self.path def dfs(self, m, n): if (m == 0) or (n == 0): self.path += 1 return else: # 改为调用当前实例的dfs方法 self.dfs(m - 1, n) self.dfs(m, n - 1) ans = Solution().uniquePaths(3, 2) print(ans) # Result : 3
内容的提问来源于stack exchange,提问作者Junyeong Ahn
相关产品推荐
相关产品推荐

