有没有办法只执行一次“if”检查而不是在循环中的每次迭代都执行检查?

有没有办法只执行一次“if”检查而不是在循环中的每次迭代都执行检查?

如果是,则等于,但如果大于 ,则\zNonZero等于。问题是,循环内的检查每次迭代都会执行:我只需要执行一次(第一次迭代)。有没有办法摆脱不必要的检查?0#101#10if

\begin{document}
\parindent0pt
\newcount\zNonZero
\def\zLoop#1%
  { \zNonZero1
    \ifnum#1<1 % HOW TO CHECK THIS ONLY ONCE?
      \zNonZero0
    \fi
    \ifnum#1<5
      #1...(\the\zNonZero)\newline
      \expandafter\zLoop\expandafter{\the\numexpr#1+1\relax}
    \fi
  }
\zLoop{0}
\end{document}

这里“if”检查了 5 次,但我们只需要检查一次:

答案1

分离第一个条件。

\documentclass{article}

\newcount\zNonZero

\def\zLoop#1{%
  \zNonZero=1
  \zLoopStart{#1}%
  \zLoopLoop{#1}%
}
\def\zLoopStart#1{%
  \ifnum#1<1 % HOW TO CHECK THIS ONLY ONCE?
    \zNonZero=0
  \fi
}
\def\zLoopLoop#1{%
  \ifnum#1<5
    #1...(\the\zNonZero)\par
    \zNonZero=1
    \expandafter\zLoopLoop\expandafter{\the\numexpr#1+1\expandafter\relax\expandafter}%
  \fi
}

\setlength{\parindent}{0pt}

\begin{document}

\zLoop{0}

\end{document}

注意另外两个\expandafter标记,以便在循环重新启动之前删除整个条件。

这可能不符合条件,但我还是要提一下。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewExpandableDocumentCommand{\zLoop}{m}
 {
  \bp_zloop:n { #1 }
 }
\cs_new:Nn \bp_zloop:n
 {
  \int_compare:nT { #1 < 5 }
   {
    #1...(\int_eval:n { \int_min:nn { #1 } { 1 } })\par
    \bp_zloop:f { \int_eval:n { #1 + 1 } }
   }
 }
\cs_generate_variant:Nn \bp_zloop:n { f }

\ExplSyntaxOff

\begin{document}

\zLoop{0}

\end{document}

答案2

\documentclass{article}    
\begin{document}
    \parindent0pt
    \newcount\zNonZero
    \newif\ifCheck \Checktrue
    \def\zLoop#1{%
        \zNonZero1
        \ifCheck\ifnum#1<1 \zNonZero0 \fi\Checkfalse\fi
        \ifnum#1<5
        #1...(\the\zNonZero)\newline
        \expandafter\zLoop\expandafter{\the\numexpr#1+1\relax}
        \fi
      \Checktrue
    }
    \zLoop{0}
\end{document}

相关内容