无穷计算的控制
在计算表达式时,Mathematica 遵循的一般原则是将变换规则一直使用到表达式不再变化为止. 这意味着,当Mathematica 进行
的赋值时将进入无穷循环. 但实际上,Mathematica 在有限步后就停止,这个步数由全局变量 $RecursionLimit 决定. 但总可以通过明确终止 Mathematica 提前结束它.
| $RecursionLimit | 计算堆栈的最大深度 |
| $IterationLimit | 计算链的最大长度 |
变量 $RecursionLimit 和 $IterationLimit 以两种方式控制 Mathematica 中的无穷计算. $RecursionLimit 限制计算链的最大长度,或由 Trace 产生的列表结构中最大嵌套的深度. $IterationLimit 限制任何计算链的最大长度,或由 Trace 产生的结构列表的最大长度.
$RecursionLimit 和 $IterationLimit 的默认值适合大部分计算和计算机系统. 可以重新设置它们为一个整数值或 Infinity. 但注意,在绝大部分计算机系统中,不要设置 $RecursionLimit=Infinity,正如 "内存管理" 所述.
| In[4]:= |
| Out[4]= |
| In[6]:= |
| In[8]:= |
无穷循环不仅花费时间而且占用内存. 限制的计算 $IterationLimit 一般不产生大的中间结构. 但$RecursionLimit 常常产生大的中间结构. 一般情况下,结构的大小是 $RecursionLimit 值的线性函数. 但有时,也会随着 $RecursionLimit 指数级增长.
赋值如
显然是一个循环. 但在使用复杂的循环时,很难确认循环结束,或者不进入无限循环. 检查的主要方向是变换规则的左右两端总不相等. 这就保证了计算过程不断前进,Mathematica 就不停止变换规则的反复使用.
在使用复杂的
条件时会产生奇怪的现象(见 "限制模式" ). 特别糟糕的是涉及全局变量的改变. Mathematica 可能会认为由于表达式没有改变,所以计算已经结束. 然而,一些其它操作的副作用可能会改变全局变量的值,所以将导致计算中的新结果. 避免这个问题的最好方式是在
条件中不使用全局变量. 这也失败时,可用 Update[s] 去令 Mathematica 更新涉及 s 的所有表达式. Update[] 令 Mathematica 更新所有的表达式.
