否则,如果 algpseudocode 中的算法不起作用

否则,如果 algpseudocode 中的算法不起作用

我尝试\Else使用包添加我的伪代码algorithmalgpseudocode但它没有显示,而且我得到了

Missing number, treated as zero.

这是我的代码和当前结果。

\usepackage{algorithm}
\usepackage[noend]{algpseudocode}

\begin{algorithm}
\caption{Homomorphism: Query Containment}\label{alg:euclid}
\begin{algorithmic}[1]
\Function{getHomorphism}{XPath $p_3$, XPath $q_3$}
    \ForAll {nodes.getLength}
    \State ($q_3(root)$ == $p_3(root)$) $\leftarrow$ \textbf{true}
    \State \textbf{return} true
    \If{true}
        \ForAll {descendantNodes.getLength}
        \State \textbf{return} true
        \If {true}
        \ForAll {childNodes.getLength}
        \State \textbf{return} true
        \If {true}
        \ForAll {wildcardNodes.getLength}
        \State \textbf{return} true
    \Else
    \State \textbf{return} false
    \EndIf
\EndFunction
\end{algorithmic}
\end{algorithm}

产生的藻类

答案1

您正在使用

\usepackage[noend]{algpseudocode}

这意味着打印的算法中没有结束符号。这在编写算法时非常成问题,因为您无法证明是否为打开的等添加了所有结束语句forif

但是——无论打印是否结束——您都必须在算法的 tex 代码中写入结束的结束,否则 TeX 会抛出错误消息,因为它会计算开始和结束语句,如果不匹配就会抛出错误!

所以我建议[noend]在调用包时删除/注释。

因为你没有描述你的算法应该做什么,所以我只能猜测你在做什么。我试着猜对了,但请检查我的代码,并在必要时纠正结束的地方!

最后,我建议使用一个显示小线条的编辑器来定位算法中相应的开口和结束标记(参见下图中的红色箭头):

编辑器中的行

现在,我最后建议使用缩进来标记相应的开始和结束符号,如下面的算法假设代码所示:

\Function{getHomorphism}{XPath $p_3$, XPath $q_3$}
  \ForAll {nodes.getLength}
    \State ($q_3(root)$ == $p_3(root)$) $\leftarrow$ \textbf{true}
    \State \textbf{return} true
    \If{true}
      \ForAll {descendantNodes.getLength}
        \State \textbf{return} true
        \If {true}
          \ForAll {childNodes.getLength}
            \State \textbf{return} true
            \If {true}
              \ForAll {wildcardNodes.getLength}
                \State \textbf{return} true
              \EndFor
            \EndIf
          \EndFor
        \EndIf
      \EndFor
    \Else % \If{true} % <=============================================
      \State \textbf{return} false
    \EndIf
  \EndFor
\EndFunction

如果算法很复杂,您可能会遇到“悬空 else”的问题。要明确 else 的位置,只需添加带有相应 If 子句的注释,如我在算法代码中所示,标记为<========

所有这些都可以帮助您全面地了解您的算法。

现在假设我猜对了,你有最终的 tex 代码

\documentclass{article}

\usepackage{algorithm}
\usepackage{algpseudocode} % <================= better without `[noend]`

\begin{document}
\begin{algorithm}
\caption{Homomorphism: Query Containment}\label{alg:euclid}
\begin{algorithmic}[1]
\Function{getHomorphism}{XPath $p_3$, XPath $q_3$}
  \ForAll {nodes.getLength}
    \State ($q_3(root)$ == $p_3(root)$) $\leftarrow$ \textbf{true}
    \State \textbf{return} true
    \If{true}
      \ForAll {descendantNodes.getLength}
        \State \textbf{return} true
        \If {true}
          \ForAll {childNodes.getLength}
            \State \textbf{return} true
            \If {true}
              \ForAll {wildcardNodes.getLength}
                \State \textbf{return} true
              \EndFor
            \EndIf
          \EndFor
        \EndIf
      \EndFor
    \Else
      \State \textbf{return} false
    \EndIf
  \EndFor
\EndFunction
\end{algorithmic}
\end{algorithm}
\end{document}

得到以下打印算法:

有末端的 alg

现在的优势是您可以简单地证明并查看算法中的 If、For、While 等在哪里结束。

如果你现在(在最终证明一切正常之后)[noend]再次添加,你会得到:

无尽的龙

如果该算法更易于阅读,您必须自己决定,我总是更喜欢带有相应结束语句的打印 - 但这是我个人的观点!

您可以尝试其他用于生成算法的软件包(参见 ctan),然后您可以获得算法中的打印行,就像我的编辑器的屏幕截图中一样。它能否更轻松地找到相应的开始和结束标记...

答案2

您缺少很多结束语句。添加它们不会再引发错误。

我添加了一些缩进,以便更容易发现嵌套块。请注意,由于缺少结束语句,输出可能与您的预期不同。我选择了一种可能的方式来结束嵌套块。

\documentclass{article}

\usepackage{algorithm}
\usepackage[noend]{algpseudocode}

\begin{document}

\begin{algorithm}
\caption{Homomorphism: Query Containment}\label{alg:euclid}
\begin{algorithmic}[1]
\Function{getHomorphism}{XPath $p_3$, XPath $q_3$}
    \ForAll {nodes.getLength}
        \State ($q_3(root)$ == $p_3(root)$) $\leftarrow$ \textbf{true}
        \State \textbf{return} true
        \If{true}
            \ForAll {descendantNodes.getLength}
                \State \textbf{return} true
                \If {true}
                    \ForAll {childNodes.getLength}
                        \State \textbf{return} true
                        \If {true}
                            \ForAll {wildcardNodes.getLength}
                                \State \textbf{return} true
                            \EndFor
                        \EndIf
                    \EndFor
                \EndIf
            \EndFor
        \Else
            \State \textbf{return} false
        \EndIf
    \EndFor
\EndFunction
\end{algorithmic}
\end{algorithm}

\end{document}

输出

相关内容