正如前文所述,所有的递归都可以使用循环来代替,计算阶乘也可以使用循环结构,但下面介绍的是使用递归结构的方法。因为 n!=n*(n-1)!,所以我们只要编写一个实现功能 F(n)=n*F(n-1) 的 VI 就可以了。
程序中,递归调用 VI 自身的结构由三个 VI 动态调用节点实现:Open VI Reference, Call By Reference Node, Close Reference。这三个节点分别负责动态打开一个 VI(本例中就是这个 VI 自身),运行这个VI,再关闭它。
使用 Call By Reference Node 需要在打开 VI 句柄的时候就要知道 VI 连线板(Connector Pane)的布局,因此,我们在用 Open VI Reference 打开 VI 的时候要提供 VI 连线板的布局信息,在例子中就是 Open VI Reference 节点上方的那个常量。
使用递归结构要注意以下几点:
递归调用的退出或结束条件,本例中当输入数据小于1时,就需要结束递归调用返回最底层的值了。如果递归调用的退出条件设置不当,可能会引起程序死循环甚至崩溃。
LabVIEW 中也可以实现 A 调用 B,B 又调用 A 这种用多个 VI 相互调用的递归结构。
参与递归调用的 VI 必须被设置为可重入,原因可以参考:《如何使用 VI 的重入属性(Reentrant)》
递归结构的运行效率不如可实现相同功能的循环结构,内存占用也会更大一些。决定使用递归结构之前要考虑到这些因素。