控制流程¶
某些情况下,函数只是按照固定的流程一步一步地进行计算。但是在其他一些情况下,函数也需要某种循环或迭代。在本节里,我们将讨论函数定义内所支持的不同控制结构。
分支结构¶
在前面章节,我们已经看到了涉及if
语句和if
表达式的例子。函数内部自然也可以包含这些元素。实际上,equation
区域对if
语句有一定的限制。那就是,if
语句的每个分支(即所有可能条件)均必须生成相同数量的方程。但是,上述限制对algorithm
区域并不适用(例如在函数定义时)。
循环¶
equation
区域要确保在任意系统状态下生成的方程数量相等。所以,循环(就像分支一样)在使用时受到了严格限制。出于这个原因,equation
区域(目前为止,我们唯一讨论过的区域)唯一允许使用的循环结构是for
循环。
在函数定义中,for
循环的语法与其在其他情况下完全一样。使用for
循环首先要确定循环变量。然后循环将数组中的数值分配给循环变量,即:
algorithm
for i in 1:10 loop
// Statements
end for;
equation
区域与algorithm
区域有两个主要的区别。这分别是:algorithm
区域使用显式赋值语句而不使用等式;因此在使用if
语句或for
语句时就不需要考虑生成方程的数量。
此外,algorithm
区域允许while
循环的使用。这让我们能更灵活地进行建模。equation
区域不允许使用while
循环的原因在于,其在本质上生成的方程数量(即equation
区域生成的方程数量)是不可预测的。但是,这种不可预见性对于algorithm
区域并没有什么影响。
在前面章节插值中,我们已经讨论了InterpolateVector
函数。其包含的while
循环的语法如下所示:
while x>=ybar[i+1,1] loop
i := i + 1;
end while;
while
循环的主要元素是一系列条件表达式。其作用在于决定是否继续执行while
循环内的语句。
break
以及return
¶
在进行循环时,某些时候需要提前结束循环过程。例如,在for
循环中,循环重复的次数通常是由循环数组的大小来决定的。但在某些情况下,后续的循环过程是没有必要的。同样的,在while
循环中,它可以方便的检查while
循环何时终止。在这类情况下,可以使用break
语句终止最内层循环。
控制流程的另一个问题是何时终止并从algorithm
区域本身退出。在很多情况下,所有的output
变量都被分配了它们的最终值。纵然,我们总可以使用if
和else
语句禁止变量的进一步计算和赋值。但若能直接表明无须进行进一步计算,那就简明和清晰了。这时,我们可以在函数的algorithm
区域使用return
语句终止所有方程的进一步运算。在执行return
语句时,output
变量将返回当前时刻与之相关联的变量值。