我对一些递归演算有以下问题。
\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--