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

2020-12-11 編碼那些事

階乘定義

非負整數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
    在LabVIEW中,對於第一步可編寫一個子程序求解n的階乘,然後在第二步中調用這個子程序計算e的值。下面對這兩個步驟分別編程實現。求解n的階乘根據階乘公式,編寫下圖所示的程序框圖,用以求解n的階乘,將該程序存儲為一子程序,該子程序輸入一個整數值「n」,輸出其階乘值「n!」。
  • LabVIEW編程實例:計算圓周率pi,學while循環,學移位寄存器
    在基礎語法部分,循環是其難點之一,LabVIEW中提供了兩種方式實現循環,分別為for和while循環,前者多用於循環總次數已知的情況,而後者多用於循環總次數不定的情況。不同於C語言,在LabVIEW編程中,循環又往往伴隨著移位寄存器的使用,稍不注意,可能就會出錯。下面通過一個例子演示while循環的使用方法。
  • LabVIEW基礎知識:手把手以實例教你學For循環和移位寄存器編程
    LabVIEW語言中四大基本程序框架結構包括順序結構、選擇結構、循環結構和事件結構,其中,循環結構是用的比較多的一種結構,而與之配套使用的移位寄存器更是LabVIEW中的編程難點之一,這次通過一個例子給大家講解一下For循環和移位寄存器的綜合編程方法,幫助大家理解這個知識點。
  • LabVIEW編程基礎:以實例學編程之循環結構
    LabVIEW編程基礎:以實例學編程之順序結構)中分別講了順序結構與條件結構的編程方法,下面通過具體例子演示循環結構的編程使用方法。For循環框多用於循環次數已知的情況,循環次數由埠「N」接入;while循環則多用於循環次數未知的情況,其循環的終止條件由條件埠給出。3. While循環不滿足條件也要執行1次,即至少執行一次;for循環當N<1時可一次都不執行。4. 在循環框上,可通過移位寄存器存儲某個變量前面幾次循環的值。
  • LabVIEW編程實例:如何求解1000以內的所有素數
    查找1000以內的所有符合條件的素數編寫一個主程序來調用上面的子程序「isPrimeNumber.vi」,查找1000以內所有符合條件的素數,其框圖程序的實現代碼如下:根據素數的定義,使用for循環查找2-1000以內的所有素數
  • 學習編程的人,怎麼能不知道什麼叫遞歸?
    話不多說,開始今天的學習:遞歸:不要看這個名字好像挺高大上的樣子,其實理解起來還是蠻容易的。在學習遞歸之前,我們先學習下目錄的遍歷,遞歸的主要使用途徑就需要它。1.for循環解決該需求看到這個需求我的第一個反應就是for循環,事實上確實可以用循環語句解決:①定義一個計算階乘的方法:getResult()。②在getResult中,定義一個變量作為階乘的結果。
  • labview循環-移位寄存器妙用
    While循環1.While循環是一種結構,它重複執行代碼片段直到滿足某種條件為止。它可比作傳統語言中的Do Loop或Repeat-Until循環。它位於編程→結構→While循環。
  • Python編程案例:計算自然數n的階乘
    阿萌又接到一個新的編程任務,要求用Python編寫一個計算自然數n階乘的程序,用於學生利用計算機來計算n的階乘。阿萌梳理了一下編程要求,他認為程序需要實現下面這些功能:程序啟動後,程序在Shell窗口輸出提示信息「請輸入一個自然數,輸入quit可退出程序:」,學生輸入一個自然數,程序計算自然數的階乘,並將計算結果輸出到Shell窗口。程序再次輸出「請輸入一個自然數:」,等待學生的下次輸入。
  • LabVIEW編程實例:手把手教你做一個圖片瀏覽器軟體
    實例說明該實例的軟體運行界面如下圖所示:軟體支持三種常用的圖片文件格式,分別為bmp、jpg和png格式。在軟體界面上包括以下控制項元素:「圖片」控制項:用來顯示瀏覽的圖片內容「打開」按鈕:選擇要瀏覽的圖片文件「前一張」和「後一張」按鈕:選擇當前目錄下的前一張或後一張圖片編程思路主程序採用循環結構+選擇結構+事件結構的框架形式
  • 計算機編程必備技巧——遞歸使用
    1、引言 今天我們來學習遞歸,如果單說學習算法, 遞歸併不能說是算法,而是一種編程的手法,為什麼現在要學習這個呢?因為後面在學習其他算法時,要牽涉一些遞歸的調用方法,是為以後理解學習的內容做好鋪墊。
  • 計算機編程必備技巧——使用遞歸
    1、引言今天我們來學習遞歸,如果單說學習算法, 遞歸併不能說是算法,而是一種編程的手法,為什麼現在要學習這個呢?因為後面在學習其他算法時,要牽涉一些遞歸的調用方法,是為以後理解學習的內容做好鋪墊。遞歸方法作為一種優雅的解題方法,是大多數程式設計師比較喜歡的編寫方式之一。
  • LabVIEW編程實例:模擬溫度採集+報警燈指示+運行記錄輸出
    實例說明這次給大家一個實用的編程例子,軟體運行界面如下圖所示:該例子的功能是,模擬一個溫度採集場景編程思路主框架採用while循環結構+事件結構的形式。主代碼在事件結構的超時分支中完成,主要處理溫度的採集、波形圖的顯示及報警記錄的輸出。對於清除圖形、清空記錄、退出程序等操作分別在各自控制項的值改變事件中完成。
  • 移位寄存器的特點_移位寄存器工作原理
    這種移位寄存器是一維的,事實上還有多維的移位寄存器,即輸入、輸出的數據本身就是一些列位。實現這種多維移位寄存器的方法可以是將幾個具有相同位數的移位寄存器並聯起來。   移位寄存器分類   根據移位方向,常把它分成左移寄存器、右移寄存器和雙向移位寄存器三種。
  • 藍橋杯簡單java遞歸算法
    絕大多數程式語言支持函數的自調用,在這些語言中函數可以通過調用自身來進行遞歸。計算理論可以證明遞歸的作用可以完全取代循環,因此在很多函數程式語言(如Scheme)中習慣用遞歸來實現循環。簡潔的講就是:可以不斷的調用自身這個函數,直到滿足一定條件結束遞歸,(一般都是遞歸到最小的單位之後進行回溯的過程)下面小編通過這五個由淺至深的題目帶領大家更好的理解神奇的遞歸算法。
  • Python進階之遞歸函數的用法及其示例
    遞歸是指函數/過程/子程序在運行過程序中直接或間接調用自身而產生的重入現象。在計算機編程裡,遞歸指的是一個過程:函數不斷引用自身,直到引用的對象已知。使用遞歸解決問題,思路清晰,代碼少。但是在主流高級語言中(如C語言、Pascal語言等)使用遞歸算法要耗用更多的棧空間,所以在堆棧尺寸受限制時(如嵌入式系統或者內核態編程),應避免採用。所有的遞歸算法都可以改寫成與之等價的非遞歸算法。
  • C語言的「遞歸函數」這麼難理解,為什麼不丟棄它呢?
    初學者在學習C語言的過程中,遇到「遞歸」的概念時,常常會感到迷惑。坦誠地說,「遞歸」在程式語言中的確是一個比較難理解的概念,而且「遞歸」能解決的問題,一般循環語句也能解決,從某種程度上來說,C語言中的「遞歸」和循環語句是等價的,既然如此,為什麼C語言不「丟棄」難以理解的「遞歸」呢?
  • 算法邏輯理論到循環、遞歸、遞推、迭代、遍歷等代碼(24500字)(附PDF發「算法邏輯循環」下載)
    大部分遞歸、遞推、遍歷、迭代等等,都是循環,或循環為主的複雜結構。5.1 重複類型算法:遞歸、遞推、迭代、遍歷三種循環結構請看前面第4節。遞歸就是根據一種(幾種)基本情況定義的算法,其他複雜情況都可以被逐步還原為該基本情況。編程中的特徵是,在函數定義內重複調用該函數。
  • python算法遞歸於尾遞歸!
    遞歸概念遞歸:程序調用自身的編程技巧稱為遞歸( recursion)。用一種通俗的話來說就是自己調用自己,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的、但是規模較小的問題來求解,當問題小到一定規模的時候,需要一個遞歸出口返回。
  • 寄存器和移位寄存器
    寄存器1.定義2.電路舉例 3.邏輯功能分析7.4.2 移位寄存器一、單向移位寄存器㈠ 由4個維持阻塞D觸發器組成4位右移位寄存器。
  • C語言編程實例:這麼簡單的遞歸別說你不會!
    雖然隔了好幾天沒有發布新的文章,但是陸陸續續還是有一些粉絲私信拿源碼的,所以小編今天就抽空給大帶來一篇簡單的C教程文章——求數N的階乘。但是我們如何利用遞歸呢?我可以從上面這個問題得知,遞歸函數的邊界條件為:當N變成1時,所以我們可以結合以上兩點得出遞歸函數的大概模型。