非負整數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程序的多重複制,在運行效率上較低,同時也存在着程序運行中調用棧溢出的風險,所以,在程序編寫過程中一般不提倡過多使用遞歸架構。
如果你覺得這篇文章對你有用的話,關注 收藏 點贊吧。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!