这个 if 语句是如何工作的?它似乎没有布尔表达式

How does this if statement work? It appears to have no boolean expression

这是一段代码。我不确定倒数第二行的 if 语句是如何工作的?它没有像 'if A[n − 1, j] == x' 之类的布尔表达式。有人可以解释一下它对我的实际作用吗?谢谢

Connected(A[0..n − 1, 0..n − 1])

  //Input: Adjacency matrix A[0..n − 1, 0..n − 1]) of an undirected graph G

  //Output: 1 (true) if G is connected and 0 (false) if it is not

if n = 1 return 1 //one-vertex graph is connected by definition

else

 if not Connected(A[0..n − 2, 0..n − 2]) return 0

 else for j ←0 to n − 2 do
          if A[n − 1, j] return 1
      return 0

if A[n−1, j] == 1 等同于 if A[n-1,j]

邻接矩阵通常有 ones 和 zeros,yes 和 no 或 true 和 false - 只有 2 个可能的值 - 基本上每个元素都有(某种)布尔值,指示 2 个顶点是否连接。此外,这是伪代码,它没有 'work' 的那么多功能,但更多的是用人类可读(和简单)的术语来传达算法。

它调用了一个 return 布尔值(0 或 1)的函数,这就是它的工作原理。

然后,当您的代码执行 A[n − 1, j] 时,它会调用 A 函数,这是您在那里定义的函数,它会(最终)return 您的布尔值

这是一个递归函数。你会看到很多,并最终理解它。其实很简单,它是一个多次调用自身的函数,每次调用都有不同的参数,直到其中一个调用真正return的结果通过所有函数链一路传回

视情况而定,因为伪代码没有严格定义,所以有多种可能的含义。

if A[n-1,j] 可以等同于(假设为数字类型)if A[n-1,j] == 1if A[n-1,j] != 0 或(假设为布尔类型)if A[n-1,j] == true。对于邻接矩阵(由二进制 true/false 或 0/1 数据组成)这些可能性可能是等价的。

您的算法将邻接矩阵缩减为单个节点 (n = 1) 的子图。在这个基本情况之后,它通过使用循环检查 "holes" 来确定您是否有连通图。

在此循环中,您将检查是否有 "orphan node"(邻接矩阵中整行均为零)。 从单个节点向上构建,您可以前向链接以查看图形是否已连接。 请注意,在无向图中,当您检查基本情况时,如果该图未完全连接,您将发现一个断开连接的节点。即使它可能附加到另一个节点--它将附加到您尚未包含在搜索中的节点。

 else
   for j← 0 to n− 2 do //we hit the base case, now forward-chain from single node
     if A[n− 1, j]//traverse the whole row (i.e. "is this node connected to anything else?")
     return 1 //there's a connection, we can return
     return 0 // if ALL zeros in adjacency matrix, you have an orphaned node

希望对您有所帮助! :)

澄清一下——if 语句有点模棱两可。对我来说,只有当您检查整个行(j 索引)中的所有零时,该算法才算完整。这是你return false 的情况。如果与前一个节点只有一个连接,则可以归纳 ("forward-chain") 并继续搜索。

干杯,
-加布

P.S。 这在检查完全空行的嵌套 for 循环中更容易阅读。