LabVIEW编程实例:计算阶乘,学习while循环+移位寄存器+递归调⽤
阶乘定义
⾮负整数n的阶乘简记为n!,在数学上定义为所有⼩于等于该数的正整数的乘积,并且定义0的
阶乘等于1,⽤公式表⽰为:
n!=1×2×3×......×(n-1)×n
对于n!也可以⽤递归⽅式定义为如下形式:
n!=(n-1)!×n,且0!=1
根据这两种定义⽅式,下⾯给出在LabVIEW中编程实现求解n!的两种⽅法。
阶乘求解⽅法1:使⽤for循环+移位寄存器实现
这种⽅法实现相对来说⽐较简单,程序框图如下图所⽰:
在上图中,直接根据阶乘定义使⽤for循环与移位寄存器的思路实现n!的计算,for循环的次数为n
次,移位寄存器的初始值为1,作n次乘法运算即可计算出n的阶乘。
注意,上图中,当n为0时,for循环执⾏次数为0次,n!的输出值直接为移位寄存器的初始值1,
符合n阶乘的定义。
阶乘求解⽅法2:使⽤递归调⽤⽅法实现
这种⽅法根据阶乘的递归⽅式的定义进⾏实现。递归VI程序顾名思义是指⼀个VI在运⾏中可以调
⽤⾃⾝的VI程序,在LabVIEW中可以容易的实现递归VI程序的设置。
对于本例要求计算n的阶乘,因为在程序运⾏中要调⽤⾃⾝,所以要将其设置为⼦程序,即在
LabVIEW编程环境的图标/连接⼝区域定义该VI的输⼊输出参数,本例参数⽐较简单,在前⾯板
调用子程序的例子
中设计⼀个输⼊控件n、⼀个输出控件n!,两个控件的数据类型皆设置为U32类型,输⼊输出参
数定义完成后,其前⾯板如下图所⽰:
其程序框图如下图所⽰:
根据阶乘的递归定义,n的阶乘为(n-1)!×n,当n=0时,n!=1。所以在上⾯程序框图中,先判断n
是否为0,若为0,则n!输出1,否则,如上图所⽰,在程序内部通过引⽤调⽤⾃⾝,实现(n-
1)!×n的计算,输出n!。
这种思路实现的关键点有两个,其⼀是将该VI设置为可重⼊的类型,其设置⽅式是,在
LabVIEW菜单中选择“⽂件”---->“VI属性”弹出VI属性设置对话框,在“类别”下拉框中选择“执⾏”,
设置“重⼊”⽅式为“共享副本重⼊执⾏”,如下图所⽰:
其⼆是如何通过引⽤调⽤⾃⾝。这⼉⽤到了两个关键函数:“打开VI引⽤”和“通过引⽤调⽤”函
数,这两个函数均可以在函数⾯板的“编程”---->“应⽤程序控制”中到。
在“打开VI引⽤”函数中设置3个参数,其中,“选项”参数设置为8,这样可以使通过引⽤调⽤可重
⼊VI有效;“VI路径”参数设置为本VI所在的路径;“类型说明符”参数设置较为⿇烦,先在这个参
数上通过右键菜单创建⼀个常量,然后在这个常量的右键菜单中选择“选择VI服务器类”---->“浏
览”,在弹出的⽂件选择对话框中选择当前VI即可,设置完成后,创建的常量外观⾃动变为如上
⾯程序框图中所⽰的⼀输⼊⼀输出参数的样式。
成功打开VI引⽤后,将其引⽤连接到“通过引⽤调⽤”函数中,则该函数⾃动出现对应VI的输⼊/输
出连接⼝,将n-1连接到输⼊端,输出即为n-1的阶乘,然后与n相乘,即得到当前n!。
通过层层调⽤直到0!=1后,即可退出递归流程,返回n!。
需要注意的⼀点是,在递归调⽤编程中,必须保证递归VI有⼀个退出情,也就是说,必须在某
些情况下使这个VI只返回⼀个值,⽽不是再次调⽤⾃⼰,否则将陷⼊到⽆限递归中。
总结
本⽂通过⼀个简单的阶乘计算例⼦,可以学到LabVIEW中循环、移位寄存器及递归调⽤等编程
知识点。需要指出的是,递归编程⽅式其优点是编程实现⽐较直观简单,但缺点是在递归调⽤
过程中,涉及到内存中⾃⾝VI程序的多重复制,在运⾏效率上较低,同时也存在着程序运⾏中
调⽤栈溢出的风险,所以,在程序编写过程中⼀般不提倡过多使⽤递归架构。
如果你觉得这篇⽂章对你有⽤的话,关注+收藏+点赞吧。