」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 遞迴-1

遞迴-1

發佈於2024-11-08
瀏覽:294

簡介1

函數呼叫自身的過程稱為遞歸,
對應的函數稱為遞歸函數.
由於電腦程式設計是數學的基本應用,因此讓
我們首先嘗試理解遞歸背後的數學推理。
一般來說,我們都知道函數的概念。簡而言之,函數是
提供輸入時產生輸出的數學方程式。例如:
假設函數 F(x) 是由下式定義的函數: F(x) = x^2 4
我們可以將此函數的 Java 程式碼編寫為:

公共靜態 int F(int x){
返回 (x * x 4);
}

現在,我們可以將 x 的不同值傳遞給該函數並接收我們的輸出
因此。
在繼續遞歸之前,讓我們試著理解另一個數學
稱為 數學歸納原理 (PMI) 的概念

數學歸納原理 (PMI) 是一種證明陳述的技術,a
公式,或關於一組自然數的定理。它有
以下三步:
1.** 簡單案例的步驟*:在這一步驟中,我們將證明
所需的陳述 基本情況,例如 n = 0 或 n = 1。
2.
* 假設步驟**:在這一步驟中,我們將假設所需的語句
對於 n = k 有效。

  1. 證明步驟:根據假設步驟的結果,我們將證明, 只要 n = k 為真,n = k 1 對於所需方程式也成立。

例如:讓我們用數學歸納法證明:
S(N): 1 2 3 ... N = (N * (N 1))/2
(前N個自然數和)
證明:
步驟 1:當 N = 1 時,S(1) = 1 成立。
步驟 2:假設,對於 N = k,給定的陳述成立,即
1 2 3 .... k = (k * (k 1))/2
步驟 3:讓我們使用步驟 2 來證明 N = k 1 的陳述。

證明: 1 2 3 ... (k 1) = ((k 1)*(k 2))/2
證明:

將(k 1)加入步驟2所獲得的結果中的LHS與RHS:
1 2 3 ... (k 1) = (k*(k 1))/2 (k 1)

現在,從 RHS 端取 (k 1) common:
1 2 3 ... (k 1) = (k 1)*((k 2)/2)

根據我們試圖證明的說法:
1 2 3 ... (k 1) = ((k 1)*(k 2))/2
由此證明。

遞歸的工作

總結以上三點我們就可以定義遞歸方法的步驟了
步驟:
●基本情況:遞迴函數必須有一個終止條件,其中
該進程將停止呼叫自身。這種情況稱為基本情況。如果沒有基本情況,它將不斷調用自身並陷入
無限循環。很快,就會超出遞歸深度*,並且會拋出
錯誤。
●遞歸呼叫:遞歸函數將在較小的版本上呼叫自身
的主要問題。我們在編寫此步驟時需要小心
正確找出你的小問題是什麼至關重要。
●小計算:一般我們在每個遞歸
中執行一次計算步驟 稱呼。我們可以在遞歸呼叫之前或之後實現這個​​計算步驟
取決於問題的性質。

注意:遞歸使用儲存遞歸呼叫的內建堆疊。因此,
遞歸呼叫的次數必須盡可能少,以避免記憶體溢位。如果
遞歸呼叫次數超過最大允許數量,
**將超過遞歸深度
**。
現在,讓我們看看如何使用遞歸解決一些常見問題

問題陳述 - 求一個數的階乘

方法:找出 PMI 的三個步驟,然後使用
將其關聯起來 遞迴

  1. 歸納步驟:計算數字 n - F(n) 的階乘 歸納假設:我們已經得到了n-1 - F(n-1)
  2. 的階乘
  3. 用F(n-1)表示F(n):F(n)=n*F(n-1)。因此我們得到

public static int fact(int n){
int ans = 事實(n-1); #假設步驟
返回 ans * n; #從假設步驟解決問題
}

  1. 代碼仍然不完整。缺少的部分是基本情況。現在我們將 試運轉以查找需要停止遞歸的情況。考慮 n = 5:

Recursion -1

正如我們上面所看到的,我們已經知道n = 0的答案,即1。所以我們將
將此作為我們的基本情況。因此,程式碼現在變成:

公共靜態 int 階乘(int n){
if (n == 0) // 基本情況
返回 1;
別的
傳回 n*階乘(n-1); // 遞迴情況
}

版本聲明 本文轉載於:https://dev.to/vishnub33527201/recursion-1-3p1e?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何在 MFC 應用程式中停用 C4996 警告?
    如何在 MFC 應用程式中停用 C4996 警告?
    在MFC 應用程式中停用C4996 錯誤遇到錯誤「錯誤C4996: 'strncpy': 此函數或變數可能不安全, “這表明存在潛在的安全問題。為了解決此錯誤,Microsoft 建議使用更安全的 strncpy_s 函數。但是,如果您希望停用棄用警告,則可以利用 _CRT_SECU...
    程式設計 發佈於2024-11-08
  • 我們如何在 O(n) 時間和 O(1) 空間內找到從 0 到 n-1 的數字數組中的重複項?
    我們如何在 O(n) 時間和 O(1) 空間內找到從 0 到 n-1 的數字數組中的重複項?
    在O(n) 時間和O(1) 空間中尋找重複項:深入解釋提出的問題涉及識別重複項數組中包含0 到n-1 範圍內的數字的元素。挑戰在於如何在 O(n) 時間複雜度內並僅使用恆定 (O(1)) 記憶體空間有效地實現這一目標。 所提出的解決方案採用了一種巧妙的技術,不需要哈希表或其他附加資料結構。相反,它利...
    程式設計 發佈於2024-11-08
  • Python 中的警告過濾器
    Python 中的警告過濾器
    Buy Me a Coffee☕ *My post explains Warning with warn() in Python. A warnings filter can set which warnings to show using these filters(actions) below....
    程式設計 發佈於2024-11-08
  • 如何在 Python 多處理池中優雅地處理鍵盤中斷?
    如何在 Python 多處理池中優雅地處理鍵盤中斷?
    Python 多處理池中鍵盤中斷的優雅處理使用 Python 多處理池時,處理鍵盤中斷事件並不總是那麼簡單。在本文中,我們將探討如何處理此類中斷並確保進程正常退出。 提供的程式碼範例示範了這項挑戰。儘管有一個用於 KeyboardInterrupt 的 catch 區塊,但按下 control-C ...
    程式設計 發佈於2024-11-08
  • 逐步設定 React 和 Vite
    逐步設定 React 和 Vite
    Vite 是一款現代建立工具,旨在提供快速高效的開發體驗,特別是對於基於 JavaScript 的應用程序,例如 React、Vue 等。 Vite本身更注重開發速度,在開發過程中以最少的配置和更快的載入時間。由於匯總的最佳化,生產建置時間通常也更快 在本教學中,您將逐步學習如何使用 Vite 安...
    程式設計 發佈於2024-11-08
  • 如何在 JavaScript 中取得轉換後元素的準確寬度和高度?
    如何在 JavaScript 中取得轉換後元素的準確寬度和高度?
    在變換後檢索寬度和高度當對元素應用諸如旋轉(45deg)之類的變換時,該元素的視覺尺寸改變。但是,JavaScript 中的 width 和 height 屬性仍然反映原始未轉換的尺寸。 解決方案:使用 getBoundingClientRect()要取得轉換後更新的尺寸,請使用HTMLDOMEle...
    程式設計 發佈於2024-11-08
  • 使用 Python 抓取喬治亞州亞特蘭大律師資料的技術指南
    使用 Python 抓取喬治亞州亞特蘭大律師資料的技術指南
    在本指南中,我們將探討如何使用 Python 從法律網站上抓取律師數據,重點關注佐治亞州亞特蘭大的律師。這些資訊對於想要尋找律師、研究律師事務所或收集附近律師資料的人來說非常有價值。我們將使用流行的 Python 庫創建一個強大的抓取工具,可以幫助您收集亞特蘭大地區律師的資訊。 先決條件 在開始之...
    程式設計 發佈於2024-11-08
  • 掌握腳本標籤:使用 Async 和 Defer 進行精確的腳本控制
    掌握腳本標籤:使用 Async 和 Defer 進行精確的腳本控制
    在 Web 開發領域,優化頁面載入時間至關重要。 標籤的兩個強大屬性 - 非同步和延遲 - 可以顯著影響網站的效能。在沒有徹底理解這些屬性的情況下使用它們可能會影響效能並導致錯誤。讓我們從基礎開始,了解這些屬性的作用以及何時使用它們。 基礎知識:腳本如何加載 預設情況下,當瀏覽器...
    程式設計 發佈於2024-11-08
  • JavaScript 中 +=_ 運算子背後的奧秘是什麼?
    JavaScript 中 +=_ 運算子背後的奧秘是什麼?
    解碼JavaScript 中神秘的=_ 運算子JavaScript 中不常見的運算子=_ 讓開發人員感到困惑,讓他們想知道它的真正本質。此運算子結合了賦值運算子 = 和一元加運算子 _。讓我們深入研究它的複雜性並揭開它的用途。 一元加運算子 (_)一元加運算子 ( ) 是一個嘗試轉換其運算元的前綴運...
    程式設計 發佈於2024-11-08
  • CSS Flexbox:建立定價表
    CSS Flexbox:建立定價表
    介紹 CSS Flexbox 是 Web 開發人員創建靈活且響應式佈局的強大工具。 Flexbox 最常見的用例之一是建立定價表,這是許多網站的關鍵元素。在本文中,我們將討論使用 CSS Flexbox 建立定價表的優點和缺點,並探討其一些關鍵功能。 優點 將 C...
    程式設計 發佈於2024-11-08
  • 如何在 JavaScript 中格式化具有特定小數位的浮點數?
    如何在 JavaScript 中格式化具有特定小數位的浮點數?
    將浮點數格式化為特定小數位在JavaScript 中,從浮點數轉換為字串可能會導致尾隨小數位。若要限制小數點後的位數,您可以使用特定函數。 舍入函數一種方法是使用舍入函數,例如 toFixed。例如:var number = 0.3445434; console.log(number.toFixed...
    程式設計 發佈於2024-11-08
  • 為什麼我放棄 Python Flask 而選擇 Django:Web 框架對決
    為什麼我放棄 Python Flask 而選擇 Django:Web 框架對決
    當您開始使用 Python Web 開發時,您可能會遇到 Django 和 Python Flask 作為兩個最佳選擇。這兩個框架都有其優點,但根據我的經驗,Django 通常是更好的選擇。 我早期使用 Python Flask 的經歷 當我第一次開始探索 Web 開發時,Pyth...
    程式設計 發佈於2024-11-08
  • React原始碼中MessageChannel的使用
    React原始碼中MessageChannel的使用
    這篇文章我們分析React原始碼中MessageChannel的用法。 我們先來了解什麼是MessageChannel。 訊息頻道 Channel Messaging API 的 MessageChannel 介面允許我們建立一個新的訊息通道並透過它的兩個 MessagePort...
    程式設計 發佈於2024-11-08
  • 掌握 Java 單元測試:&#Student Class Test&# 項目
    掌握 Java 單元測試:&#Student Class Test&# 項目
    透過 LabEx 的學生類測試專案深入單元測試的世界,釋放您作為 Java 開發人員的潛力。這門綜合課程將引導您完成為簡單的 Student 類別編寫有效單元測試的過程,使您能夠編寫更可靠和可維護的程式碼。 介紹 在不斷發展的軟體開發領域,編寫健全且經過良好測試的程式碼的能力變得越...
    程式設計 發佈於2024-11-08
  • 如何在 JavaScript 中模擬屬性的 noSuchMethod 功能?
    如何在 JavaScript 中模擬屬性的 noSuchMethod 功能?
    如何在JavaScript 中實現noSuchMethod 屬性功能在JavaScript 中,noSuchMethod在JavaScript 中,noSuchMethod雖然標準 JavaScript 語言中的屬性沒有直接等效項,但可以模擬類似的屬性使用 ECMAScript 6 代理程式的功能。...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3