关于递归
一个可以调用自己的VI就叫做递归VI 。换言之,如果LabVIEW应用中使用递归,它就会打开很多自己的拷贝,从而完成指定的任务。例如,一个递归的典型应用就是计算一个阶乘(用!表示)。任何正整数的阶乘就是从1开始一直乘到这个数的结果。因此,3! = 3*2*1 = 6。在下面附带的递归VI factorial.vi 例子通过将当前数与当前数-1的阶乘相乘而得,也就是调用了自己。 数学公式如下,3!=3*(2!)。在这个递归factorial VI中,1!和0!(特殊情况)被定义为结果是1。
可重入VI
需要强调的一点是,一个递归VI必须在内存中复制它的很多备份,这个VI我们也把它叫作可重入的。换句话来说,每个递归VI的实例有它自己的,与其他实例VI不一样的数据。下面所列的步骤保证了一个递归VI被设置为可重入的。
创建一个递归的步骤
按照下面的步骤,将一个VI编写为可支持调用自己的功能。
- 安放好前面版上的输入控件和显示控件(确保他们都有合适的表示方式),通过右键点击前面版右上角的图标和选择Show Connector Pane来设置连接版。
- 通过选择 File»VI Properties»Execution»Reentrant execution.
来将VI设置为可重入。 - 在VI的程序框图中,当前VI的一个拷贝必须在运行时调用Call Reference Node。首先,打开函数选版,选择Application Control»Open VI Reference。将递归VI路径连上,并将options的输入设置为8,这样可以使通过引用调用可重入VI有效。
- 在Open VI Reference图标中的type specifier VI refnum 中点右键,然后点击 create»constant。在已经创建的常量上点右键,选择 Select VI Server Class»Browse. 选择递归VI的位置,并选择OK。注意到类型标志常量的连接版现则已经表示了这个递归VI的连接版了。
- 将新打开的VI引用连接入位于Application Control»Call By Reference Node下函数版中的Call By Reference Node。并且将线将整个通过引用被调用的VI的输入和输出口都连好(根据您应用的具体情况)。
- 使用位于Application Control»Close VI Reference下的函数面板中的Close VI Reference来关闭VI的引用。
- 保证你的递归VI有一个退出情况。换句话来说,必须有些情况使这个VI只返回一个值,而不是再次调用自己。这个是最终的步骤,现在VI已经被配置为可进行递归了。
阶乘例子
打开附带在下面的factorial.vi,它是一个递归VI的例子。运行整个VI,然后就能得到输入整数的阶乘结果了。
[…] 当然,目前主流的高级语言都支持递归算法,只是实现方式略有区别,一个使用图形化的编程语言LabVIEW实现递归的例子见在LabVIEW中使用递归算法计算阶乘. […]