LabVIEW 2009递归研究

Part I : Handson

各位安装LabVIEW2009的同学请跟我做以下动作:

1:打开LabVIEW 2009.

[![image](https://f2gz7g.bay.livefilestore.com/y1mVYx9-iHIRHcVhl1R903uSWy0-7PkCqDKWTjNmCB171fHEVJhJmm79IjSw8KMzvYCuM6Z5NBkVimPJR-mpTTYeg90perGOqBtBghB04N9a5TZxdGEpKA43q7B8oH0ZeBmT9DvaqRKUNied1mU6jx0Hg/image_thumb 63232C87.png “image”)](https://f2gz7g.bay.livefilestore.com/y1mJf781TsQY2lMDPJPSS-Ciy9j5BqCKwwYq4up4HegzWdSPRRoK9XmPUSm0MhcjjsGdO3yBFl5o2ZUoHcAEFlDD9Idvou3kEx52H_zGgNN4Qq5OZzivi1JsoCTqmPU_J_g-6lkWGxiRub0O8NdLW8Kxw/image2 7AFEC386.png)

2:Ctrl+N

[![image](https://f2gz7g.bay.livefilestore.com/y1m0ogiAD6Jc2Cbxy3vpUAV6MrpE_K_Dabfar0aXUtgde7OEMLg1Ikyjmx3q6DM4dkzDU_ZVa6Vytc1aN8w4VtsYpBTtJfnyzax9NbFx2nJxlG1Xl3AxOMCDjiSzLGO49ZYdrJkMuRUh4NDF1juq0lLrw/image_thumb2 1A28A6A4.png “image”)](https://f2gz7g.bay.livefilestore.com/y1mqUA4E2HIjdW9Gb3BZtx2IS9OvqufNm9ay5c3yoX7YyZtiExwtvNyKY6zO4IzSS5_hYD1H1mT82bnVU8GrzxlS_AzTvrzEsxkIBloXGJEeXVT03GQDPTy5-7VXeuYh0kU6fKN5Cf7WXnw8gIPYYITWQ/image8 2D5308B1.png)

3:Ctrl+I,按下图配置

![image](https://f2gz7g.bay.livefilestore.com/y1mWhcbcuZQz7gwaAOLMDXl0lxrADAEmDyvRlECQD82oaX6EZrXUYRrfHsVXGO5GeLIRwcnLZvKAYu-BD54k0csbzWE7BjJ2JoQWhEkENXymMMwr49aIlhjK48h_aaq6c4M4AbE7BrVuzcnTQsPSm0VWg/image_thumb4 796A50DA.png “image”)

4:Ctrl+E,选择程序框图,将图标拖到程序框图

![image](https://f2gz7g.bay.livefilestore.com/y1mcDpF6XgX1ChPJouSMEIE3qw8z_IizPqK5nXIwFlwPTl6ctx5Sw4BOgOf6XBGnJ66dpW_iJwhD3q6fWGya3VDTf5jr2lAylB_2U88qUcEnbUvEFn6OVw03NftdN2c39p1nxqkamVlrhq0EH9BIeRwEQ/image_thumb6 708CFF2E.png “image”)

5:Ctrl+R,然后稍等5分钟:

image

恭喜你编写了第一个递归VI并且让他挂掉了。

** Part II : Basic I**

好,我们来玩点实在的,先看看LabVIEW 的例程:

image

Demo Recursion

Recursion

在LabVIEW以前的版本只有类才能使用递归,不过现在已经比较成熟,普通的VI也可以递归了。

注意事项正如图中注释,我就不多废话。

Part III : Basic I

为了更详细的演示递归,我们请出教科书里的经典例程汉诺塔。

首先附赠一个汉诺塔小游戏:

image

hanoi tower

附赠小游戏汉诺塔下载:

(LabVIEW2009)

#include <stdio.h>
void hano(int n,char a,char b,char c)
{
    if(n==1) 
        printf("t将%d个盘片从%c移动到%cn",n,a,c);
    else {
        hano(n-1,a,c,b);
        printf("t将第%d个盘片从%c移动到%cn",n,a,c);
        hano(n-1,b,a,c);
    }
}
main()
{
    int n;
    printf("输入将要移动多少个盘子n:");
    scanf("%d",&n);
    printf("递归结果:n");
    hano(n,'x','y','z');
} 

然后我们来看看LabVIEW里面如何实现这个算法:

![auto hanoi tower](https://f2gz7g.bay.livefilestore.com/y1mprygHzelJggiWKEkuwsSFY4M5mNbiguBIY5D7W2O9OD5HWZEsrxZuv2G5dv0Xm0gKLPXG60Tm1TqkTvBTIdvpxXoYjKlQG6JepC8a0f9Q4pOsO7iWMu1mKv7QYUrD0oWkuV2bYUM7tVMWd4Y0Wtbnw/auto hanoi tower[2].png “auto hanoi tower”)

主程序调用算法,然后演示步骤。

auto hanoi tower recursion

递归调用算法。

Quit Recursion

当然不要忘记设置退出递归的条件。

源代码下载

[auto hanoi tower demo.7z](https://f2gz7g.bay.livefilestore.com/y1mzRAxsj5doJkMoW9WmdSPEQ3iq-X2OaTxJbPM4puKlPm79rh8T6O4U2h3pG8ZBzN8D6gzvsqrP-Sga8PVoRgSpxoLS5mprGxbuzJ3iO-ta5ZzyiZVb0tZ8eG5p_fnTbMme4M5-aBWVFHDog-XemQRKg/auto.hanoi.tower.demo.7z)
(LabVIEW2009)

Part IV : Advance I

到底递归有什么用呢?我们来看一个实用一点的工具:VI图标提取器

image

主程序:

output vi icon

递归代码

enum vi icon

源目录

image

输出目录

image

Part V : Advance II

另外程序里附赠了一个利用LabVIEW自带的枚举函数写的同功能VI,大家可以看看,这个是可以枚举llb的。

labview recusion path

[Recursion VI Icon.7z](https://f2gz7g.bay.livefilestore.com/y1mnRGuf_j3Gb5TpKVjOD5CxZ8UBELgZPqY3gZOVgWHl5DBflI0ZjbDuo1EUl-risW3uaQ7wgUlVRHJIDQ_ypyOhRQddP40jPnRG5uEJ1q_4sGMc7lSHn84388p379VGkZgLTFRvZ--1OjwUlAVXTMCtA/Recursion.VI..Icon.7z)

最后总结一下递归要注意的事项:

1:真的有必要用递归么?

2:你的程序能否正常退出递归?

3:递归的过程是无法直接调试的,有没有好的办法保证VI按照我们的预期执行?

如果这三个问题都能保证,恭喜你,你可以使用递归来提高你程序的效率了。