在 LabVIEW 中实现 VI 的递归调用
要在LabVIEW 中使用递归调用并不是很方便。好在递归并不是软件所必须的程序结构,任何需要使用递归调用的地方,都可以用循环结构来代替,这也许这就是 LabVIEW 还没有改进其递归调用结构的原因之一吧。但是在某些情况下,使用递归调用的确可以大大简化程序代码,对缩短编程时间、提高程序可读性都非常有帮助,所以学习递归的实现方法还是有一定好处的。LabVIEW 不能通过静态调用的方法(把子 VI 直接放到另一 VI 的程序框图上)来实现递归结构,只能使用动态调用的方法才能实现 VI 的递归调用。图1 是一个计算阶乘的例子,可以点击后面的连接直接下载事例 VI:http://ruanqizhen.googlepages.com/Factorial.vi。
图1:利用递归结构计算阶乘
正如前文所述,所有的递归都可以使用循环来代替,计算阶乘也可以使用循环结构,但下面介绍的是使用递归结构的方法。因为 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)》
递归结构的运行效率不如可实现相同功能的循环结构,内存占用也会更大一些。决定使用递归结构之前要考虑到这些因素。
转自http://ruanqizhen.spaces.live.com/Blog/cns!1pU-rgQVTuuWM1TX8W8PfmDA!1073.entry
版权归原作者所有
页:
[1]