LabVIEW編程實例:計算階乘,學習for循環+移位寄存器+遞歸調用

2021-01-08 編碼那些事

階乘定義

非負整數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程序的多重複制,在運行效率上較低,同時也存在著程序運行中調用棧溢出的風險,所以,在程序編寫過程中一般不提倡過多使用遞歸架構。

如果你覺得這篇文章對你有用的話,關注+收藏+點讚吧。

相關焦點

  • LabVIEW編程實例:如何求解自然常數e
    求倒數,然後再累加求和需要說明的是,上式是無窮多項式的累加,編程實現時不可能計算無窮多項的和,因此可限定有限項相加求和,限定的方法,可使用限定某一項的絕對值小於某個數,如小於10的-8次方(0.00000001)。在LabVIEW中,對於第一步可編寫一個子程序求解n的階乘,然後在第二步中調用這個子程序計算e的值。下面對這兩個步驟分別編程實現。
  • LabVIEW編程實例:如何求解1000以內的所有素數
    查找1000以內的所有符合條件的素數編寫一個主程序來調用上面的子程序「isPrimeNumber.vi」,查找1000以內所有符合條件的素數,其框圖程序的實現代碼如下:根據素數的定義,使用for循環查找2-1000以內的所有素數
  • Python編程案例:計算自然數n的階乘
    阿萌又接到一個新的編程任務,要求用Python編寫一個計算自然數n階乘的程序,用於學生利用計算機來計算n的階乘。阿萌梳理了一下編程要求,他認為程序需要實現下面這些功能:程序啟動後,程序在Shell窗口輸出提示信息「請輸入一個自然數,輸入quit可退出程序:」,學生輸入一個自然數,程序計算自然數的階乘,並將計算結果輸出到Shell窗口。程序再次輸出「請輸入一個自然數:」,等待學生的下次輸入。
  • labview循環-移位寄存器妙用
    While循環1.While循環是一種結構,它重複執行代碼片段直到滿足某種條件為止。它可比作傳統語言中的Do Loop或Repeat-Until循環。它位於編程→結構→While循環。每個While循環都有一個條件端子和一個重複端子。
  • 遞歸和循環計算斐波那契數列第n項的值
    遞歸和循環計算斐波那契數列第n項的值。遞歸的底層實現原理。開始計算斐波那契數列第n項的值。斐波那契數列 斐波那契數列,是數學家以兔子繁殖為例子引入,又稱為兔子數列。如下:1、1、2、3、5、8、12、21、34…第一項和第二項為1,其後,每一項都是它之前兩項的和。
  • 移位寄存器的特點_移位寄存器工作原理
    這種移位寄存器是一維的,事實上還有多維的移位寄存器,即輸入、輸出的數據本身就是一些列位。實現這種多維移位寄存器的方法可以是將幾個具有相同位數的移位寄存器並聯起來。   移位寄存器分類   根據移位方向,常把它分成左移寄存器、右移寄存器和雙向移位寄存器三種。
  • C語言編程實例:這麼簡單的遞歸別說你不會!
    雖然隔了好幾天沒有發布新的文章,但是陸陸續續還是有一些粉絲私信拿源碼的,所以小編今天就抽空給大帶來一篇簡單的C教程文章——求數N的階乘。這個比較簡單,各位就當做娛樂板塊來看啦首先,我們來捋一捋,求數N的階乘,無非就是N(N-1)(N-2)(N-3)...1,從這裡我們可以發現一個規律,後面的一個數總比前面一個數少1,並且最後一個數字為1,他們跟公差為1的等差數列有點相似,所以我們很快就能想到用遞歸來解決這個問題。但是我們如何利用遞歸呢?
  • 移位寄存器的原理
    現在小編大家知道移位寄存器嗎? 移位寄存器的原理 移位寄存器不僅能寄存數據,而且在時鐘信號的最用下使它其中的數據依次左移或者右移。 四位移位寄存器的原理:F0、F1、F2、F3是四個邊沿觸發的觸發器D,每一個觸發器的輸出端Q接到右邊一個觸發器的輸入端D。
  • 移位寄存器的作用及應用
    這種移位寄存器是一維的,事實上還有多維的移位寄存器,即輸入、輸出的數據本身就是一些列位。實現這種多維移位寄存器的方法可以是將幾個具有相同位數的移位寄存器並聯起來。   移位寄存器原理   移位寄存器不僅能寄存數據,而且能在時鐘信號的作用下使其中的數據依次左移或右移。   四位移位寄存器的原理圖如圖所示。
  • 移位寄存器的工作原理是什麼?
    這說明存入該寄存器中的數碼也可以從Q端串行輸出。根據需要,可用更多的觸發器組成多位移位寄存器。 除了用邊沿D 觸發器外,還可用其他類型的觸發器來組成移位寄存器,例如,用主從JK 觸發器來組成移位寄存器,其級間連接方式如圖8.8.3所示。
  • 移位寄存器74ls194應用電路圖大全(雙向移位寄存器/74HC93/環形...
    移位寄存器74ls194應用電路圖(一) 用兩片4位雙向移位寄存器74LS194接成一個8位雙向移位寄存器。 所要涉及的8位雙向移位寄存器需要完成8位二制數據的寄存,因此需要由兩片4位雙向移位寄存器74LS194組成。同時,8位雙向移位寄存器應具備4位雙向移位寄存器所有的邏輯功能,即能實現並行輸入、左移寄存、右移寄存、數據保持和異步清零等功能。 如圖所示,通過分析,將兩片4位雙向移位寄存器的輸入和輸出同時作為8位雙向移位寄存器的輸入和輸出。
  • LabVIEW實例,如何編程實現一個虛擬FFT分析儀
    LabVIEW又稱為G語言,簡單易學、形象直觀,採用圖形化的編程方式,是專為測試、測量和控制應用而設計的系統工程軟體。因此,LabVIEW軟體在數據仿真、信號分析處理方面有著得天獨厚的優勢。本文以一個具體實例,演示在LabVIEW中如何實現一個虛擬的FFT分析儀設計,包括採樣信號的仿真、頻域的FFT分析及數據結果的圖形顯示等功能。
  • 高斯求和如何用遞歸實現,Python詳解遞歸那些事,看這1篇足夠!
    關於遞歸,網上有一大堆描述資料,很專業,也很詳細。感興趣的小夥伴可以隨手搜一搜。但是,用我們自己聽得懂的話來講,就是「自己調用自己」的方式;那麼,很容易理解,遞歸函數就是在函數實現過程中,直接或間接調用了函數本身的函數。【舉個例子】我們知道,國外有一個很出名的數學家高斯,在他9歲的時候,用很短的時間計算出了小學老師布置的任務,對自然數從1到100的求和。
  • 雲計算開發學習實例:Python3 計算 n 個自然數的立方和
    計算公式 13 + 23 + 33 + 43 + …….+ n3實現要求:輸入 : n = 5輸出 : 225公式 : 13+ 23 + 33 + 43 + 53 = 225輸入 : n = 7輸入 : 784公式 : 13 + 23 + 33 + 43 + 53 + 63 + 73 = 784以上實例輸出結果為:程序1至
  • 如何優雅地使用javascript遞歸畫一棵結構樹
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫遞歸和尾遞歸簡單的說,遞歸就是函數自己調用自己,它作為一種算法在程序設計語言中廣泛應用。其核心思想是把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解。一般來說,遞歸需要有邊界條件、遞歸前進階段和遞歸返回階段。
  • 用java計算一個數的階乘原來這麼簡單!
    昨天給大家分享了java中的for循環,用for循環計算一千以內所以整數的和,不知大家學得怎麼樣了?for循環是一個很強大的知識點,我們會經常使用,所以今天再講一個與for循環有關的代碼,那就是計算一個數的階乘。階乘想必大家都知道,一個數的階乘就等於這個數乘所有小於它的正整數,公式也就是:n!=1x2x3x……x(n-1)xn。
  • 資料| Python入門經典:以解決計算問題為導向的Python編程實踐
    from=leiphonecolumn_res0429內容簡介 《Python入門經典:以解決計算問題為導向的Python編程實踐》是一本系統而科學的Python入門教程,美國密西根州立大學等多所美國知名高校採用其作為程式語言的入門教材,被奉為經典。
  • Java之遞歸求階層
    各位小夥伴們大家好,在之前的文章中小編介紹了Java之使用遞歸計算1-n之間的和,這次小編要介紹的是,用遞歸求階乘。階乘:所有小於及等於該數的正整數的積n的階乘:n!練習:使用遞歸計算階乘,代碼如下:public class Demo03Recurison {public static void main(String args[]) {int s=sum(5);System.out.println(s);}/*定義一個計算階乘的方法5的階乘:5!
  • ARM指令學習筆記
    有了個簡單了解之後,開始投入到了arm指令的學習。參考"arm百度百科","NDS百度百科"本文引用地址:http://www.eepw.com.cn/article/201611/316807.htm接下來就是對arm指令的學習。因為有過前面8086指令的學習,並且也寫過像高精度計算這樣的彙編程序,看arm指心裏面老在比較這兩套指令。
  • 基於FPGA的移位寄存器流水線結構FFT處理器設計與實現
    對於移位寄存器,在實現時,各級的前級移位寄存器深度為N/2-1,從本質而言,是使運算開始的時鐘上升沿到來時,數據已經出現在碟算模塊輸入線上,而不需要下一個時鐘的驅動來移出寄存器,比如第二級移位寄存器的級數為63。這樣,運算周期正好是2的倍數,從而方便使用計數器的各位直接對開關進行控制。  同時,計數器還可以用來產生所需旋轉因子的RAM地址。