无穷计算的控制

在计算表达式时,Wolfram 语言遵循的一般原则是将变换规则一直使用到表达式不再变化为止. 这意味着,当 Wolfram 语言进行 的赋值时将进入无穷循环. 但实际上,Wolfram 语言在有限步后就停止,这个步数由全局变量 $RecursionLimit 决定. 但总可以通过明确终止 Wolfram 语言提前结束它.

这个赋值可能导致无穷循环. Wolfram 语言在由 $RecursionLimit 决定的有限步后停止.
In[1]:=
Click for copyable input
Out[1]=
当 Wolfram 语言没有计算完而停止时,它返回一个保持的结果,通过调用 ReleaseHold 可继续计算.
In[2]:=
Click for copyable input
Out[2]=
$RecursionLimit计算堆栈的最大深度
$IterationLimit计算链的最大长度

限制无穷计算的全局变量.

这是一个循环定义,它的计算由 $IterationLimit 停止.
In[3]:=
Click for copyable input
Out[3]=

变量 $RecursionLimit$IterationLimit 以两种方式控制 Wolfram 语言中的无穷计算. $RecursionLimit 限制计算链的最大长度,或由 Trace 产生的列表结构中最大嵌套的深度. $IterationLimit 限制任何计算链的最大长度,或由 Trace 产生的结构列表的最大长度.

$RecursionLimit$IterationLimit 的默认值适合大部分计算和计算机系统. 可以重新设置它们为一个整数值或 Infinity. 但注意,在绝大部分计算机系统中,不要设置 $RecursionLimit=Infinity,正如 "内存管理" 所述.

这里将 $RecursionLimit$IterationLimit 设置为 .
In[4]:=
Click for copyable input
Out[4]=
这里的无穷定义20步以后结束.
In[5]:=
Click for copyable input
Out[5]=
无结束条件时,这个递推定义将导致无穷计算.
In[6]:=
Click for copyable input
计算结束之前已形成了一个相当大的结构.
In[7]:=
Click for copyable input
Out[7]=
另一个递推定义.
In[8]:=
Click for copyable input
在这里,没有形式复杂的结构,计算由 $IterationLimit 结束.
In[9]:=
Click for copyable input
Out[9]=

无穷循环不仅花费时间而且占用内存. 限制的计算 $IterationLimit 一般不产生大的中间结构. 但$RecursionLimit 常常产生大的中间结构. 一般情况下,结构的大小是 $RecursionLimit 值的线性函数. 但有时,也会随着 $RecursionLimit 指数级增长.

赋值如 显然是一个循环. 但在使用复杂的循环时,很难确认循环结束,或者不进入无限循环. 检查的主要方向是变换规则的左右两端总不相等. 这就保证了计算过程不断前进,Wolfram 语言就不停止变换规则的反复使用.

在使用复杂的 条件时会产生奇怪的现象(见 "限制模式" ). 特别糟糕的是涉及全局变量的改变. Wolfram 语言可能会认为由于表达式没有改变,所以计算已经结束. 然而,一些其它操作的副作用可能会改变全局变量的值,所以将导致计算中的新结果. 避免这个问题的最好方式是在 条件中不使用全局变量. 这也失败时,可用 Update[s] 去令 Wolfram 语言更新涉及 s 的所有表达式. Update[] 令 Wolfram 语言更新所有的表达式.