【问题标题】:checking if the graph is bipartite.why is my function returning none?检查图表是否为二分图。为什么我的函数没有返回?
【发布时间】:2020-05-29 20:11:23
【问题描述】:
import collections
class Solution(object):
    def possibleBipartition(self, N, dislikes):
        graph = collections.defaultdict(list)
        for u, v in dislikes:
            graph[u].append(v)
            graph[v].append(u)

        color = {}
        def dfs(node, c = 0):
            if node in color:
                return color[node] == c
            color[node] = c
            for nei in graph[node]:
                dfs(nei,c^1)

        for node in range(1, N+1):
            if node not in color:
                dfs(node)
g=Solution()
N=3
dislikes=[[1,2],[2,3]]
print(g.possibleBipartition(N, dislikes))

网上有很多解决方案。但我是递归新手。我想了解为什么我的函数不返回任何内容,因为这些知识稍后会帮助我:) 提前致谢。

【问题讨论】:

  • 你能确保格式化你的代码,使缩进在正确的位置吗?上面的代码不适合我。
  • @MLavrentyev 完成。我是新手,但我一定会在再次发布之前检查这些内容。
  • 别担心!感谢您清理它

标签: python recursion graph depth-first-search


【解决方案1】:

似乎它正在返回 None 因为您的代码中的任何地方都没有 return ...。我会确保你明确地返回你需要的地方。例如,您可能希望在两个地方添加 return 语句:

return dfs(nei,c^1)

在您的 dfs() 函数中以及:

return dfs(node)

在您的 possibleBipartition() 函数中。

请注意,如果有与 Racket 和 Haskell 等语言不同的返回值,则需要在 Python 中显式指定返回值。

【讨论】:

    【解决方案2】:

    表面上,函数返回None,因为你没有返回语句。所以函数 possibleBipartition 不返回任何东西(即无)。这只是 python 允许您在没有任何错误的情况下执行的语法操作,这可能会让新手感到困惑。您将需要从您的函数中返回一些内容,以便您的打印语句不只是打印None。一个好主意可能是当且仅当 possibleBipartition 有效时才返回 True。

    您可以进行的一项调整是检查您在函数中构建的颜色字典,以查看“possibleBipartition”是否有效。这可以通过了解以下事实来实现:如果每个顶点仅属于一种颜色(在您的情况下为 0 或 1),则图具有有效的二分法。

    【讨论】:

    • 我只是稍微考虑一下你的建议。如果 color[node]!=c 并且如果未设置标志返回 true,则无需添加 return 语句也可以这样做。我对递归更有信心。谢谢
    猜你喜欢
    • 2012-09-07
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多