存储递归演算的问题

存储递归演算的问题

我对一些递归演算有以下问题。

\recsum我只是编写了一个递归计算未指定数量的整数之和的函数。

当我单独调用该函数时,它可以工作。但是当我尝试存储结果时,它不再起作用。错误:

! 不完整 \iffalse;第 22 行之后的所有文本均被忽略。\fi

我尝试打印\expandafter\meaning\mysum{12345},但它只会让我更加困惑......

以下是我编写的代码:

\documentclass{article}

\usepackage{tikz}

\begin{document}

\def\recsum#1#2#3\endsum{%
  \pgfmathsetmacro{\ble}{#1+#2}%
  \def\dum{#3}%
  \ifx\dum\empty%
     \ble%
  \else%
     \recsum{\ble}#3\endsum%
  \fi%
}

\def\mysum#1{\recsum{0}#1\endsum}

-- \mysum{14283} --

% % This doesn't work:
% \edef\ble{\mysum{14283}}

\end{document}

这里发生了什么事?

答案1

以完全可扩展的方式(结果中没有小数部分):

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewExpandableDocumentCommand{\listsum}{m}
 {
  \int_eval:n { 0 \tl_map_function:nN { #1 } \vinzza_sum:n }
 }
\cs_new:Nn \vinzza_sum:n { + #1 }
\ExplSyntaxOff

\begin{document}

\listsum{14282}

\listsum{123456789{10}}

\edef\result{\listsum{57}}
\texttt{\meaning\result}

\end{document}

在此处输入图片描述

你甚至可以留下空格,所以

\listsum{1 4 2 8 2}

会产生 17;但是,多位数字仍然需要用括号括起来,因此你可以这样做

\listsum{1 2 3 4 5 6 7 8 9 {10}}

另一方面,没有额外的包装

\documentclass{article}

\newcommand{\dosum}[1]{\the\numexpr#1\relax}

\begin{document}

\dosum{1+2+3+4+5}

\end{document}

可以轻松打印 15(允许任意数量的加数,只要最终总和小于 2 31)。这也是完全可扩展的,因此您可以这样做

\edef\result{\dosum{1+2+3+4+5}}

将结果存储在宏中。

答案2

@phelype 的建议非常有效!

您可以让宏\mysum具有一个可选参数,如果存在,则在计算结束时接收结果。 或多或少与xstring包一样。

再次感谢!

工作代码:

\def\recsum#1#2#3\endsum{%
  \pgfmathsetmacro{#1}{#1+#2}%
  \def\dum{#3}%
  \ifx\dum\empty\else%
  \recsum{#1}#3\endsum%
  \fi%
}
\def\mysum#1#2{\def#1{0}\recsum{#1}#2\endsum}

\mysum\results{14282}
--\results--

相关内容