在 \foreach 循环中重新定义变量

在 \foreach 循环中重新定义变量

我正在尝试用 tikz 绘制一些递归定义的序列,但遇到了一些我无法理解的行为,这是我的代码:

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro{\f}{1}
\foreach\i in {1,...,10} {
  \pgfmathsetmacro{\ff}{\i*\f}
  \draw (0,\i) node {\ff};
  \pgfmathsetmacro{\f}{\ff}
  }
\end{tikzpicture}
\end{document}

我本来希望这会打印前十个整数的阶乘序列(向下),但我得到的是 10,9,...,1。发生了什么?我该如何在 Tikz 中处理这种递归定义的函数?

答案1

循环中的代码foreach位于 TeX 组中,因此所有定义都属于该组。\global\let\f=\ff在循环末尾添加。正如 egreg 在其评论中所建议的那样,名称较短的全局宏很可能会破坏某些东西。您可以\f使用较长的名称进行重命名。

另一个问题:$7!$TeX 可计算的最大阶乘是多少(TeX 最大值是 16383.99998)。

以下是代码:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
  \pgfmathsetmacro{\myglobalfactorial}{1}
  \foreach\i in {1,...,7} {
    \pgfmathsetmacro{\ff}{\i*\myglobalfactorial}
    \draw (0,\i) node {\ff};
    %\pgfmathsetmacro{\myglobalfactorial}{\ff}
    \global\let\myglobalfactorial=\ff
  }
\end{tikzpicture}
\end{document}

其他解决方案使用evaluateremember键(记住的变量始终是全局的,因此选择一个长名称):

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
  \foreach \i [evaluate=\i as \ff using \i*\myglobalfactorial,
               remember=\ff as \myglobalfactorial (initially 1)] in {1,...,7} {
    \draw (0,\i) node {\ff};
  }
\end{tikzpicture}
\end{document}

相关内容