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

遞迴-1

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

簡介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]刪除
最新教學 更多>
  • 如何在鼠標單擊時編程選擇DIV中的所有文本?
    如何在鼠標單擊時編程選擇DIV中的所有文本?
    在鼠標上選擇div文本單擊帶有文本內容,用戶如何使用單個鼠標單擊單擊div中的整個文本?這允許用戶輕鬆拖放所選的文本或直接複製它。 在單個鼠標上單擊的div元素中選擇文本,您可以使用以下Javascript函數: function selecttext(canduterid){ if(d...
    程式設計 發佈於2025-05-14
  • HTML格式標籤
    HTML格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2025-05-14
  • 如何使用Python有效地以相反順序讀取大型文件?
    如何使用Python有效地以相反順序讀取大型文件?
    在python 中,如果您使用一個大文件,並且需要從最後一行讀取其內容,則在第一行到第一行,Python的內置功能可能不合適。這是解決此任務的有效解決方案:反向行讀取器生成器 == ord('\ n'): 緩衝區=緩衝區[:-1] ...
    程式設計 發佈於2025-05-14
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式接口中實現垂直滾動元素的CSS高度限制問題:考慮一個佈局,其中我們具有與用戶垂直滾動一起移動的可滾動地圖div,同時與固定的固定sidebar保持一致。但是,地圖的滾動無限期擴展,超過了視口的高度,阻止用戶訪問頁面頁腳。 $("#map").css({ margin...
    程式設計 發佈於2025-05-14
  • CSS強類型語言解析
    CSS強類型語言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    程式設計 發佈於2025-05-14
  • 如何避免Go語言切片時的內存洩漏?
    如何避免Go語言切片時的內存洩漏?
    ,a [j:] ...雖然通常有效,但如果使用指針,可能會導致內存洩漏。這是因為原始的備份陣列保持完整,這意味著新切片外部指針引用的任何對象仍然可能佔據內存。 copy(a [i:] 對於k,n:= len(a)-j i,len(a); k
    程式設計 發佈於2025-05-14
  • 如何使用Regex在PHP中有效地提取括號內的文本
    如何使用Regex在PHP中有效地提取括號內的文本
    php:在括號內提取文本在處理括號內的文本時,找到最有效的解決方案是必不可少的。一種方法是利用PHP的字符串操作函數,如下所示: 作為替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式來搜索特...
    程式設計 發佈於2025-05-14
  • 如何簡化PHP中的JSON解析以獲取多維陣列?
    如何簡化PHP中的JSON解析以獲取多維陣列?
    php 試圖在PHP中解析JSON數據的JSON可能具有挑戰性,尤其是在處理多維數組時。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    程式設計 發佈於2025-05-14
  • 如何在Chrome中居中選擇框文本?
    如何在Chrome中居中選擇框文本?
    選擇框的文本對齊:局部chrome-inly-ly-ly-lyly solument 您可能希望將文本中心集中在選擇框中,以獲取優化的原因或提高可訪問性。但是,在CSS中的選擇元素中手動添加一個文本 - 對屬性可能無法正常工作。 初始嘗試 state)</option> < o...
    程式設計 發佈於2025-05-14
  • 如何使用FormData()處理多個文件上傳?
    如何使用FormData()處理多個文件上傳?
    )處理多個文件輸入時,通常需要處理多個文件上傳時,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    程式設計 發佈於2025-05-14
  • 使用jQuery如何有效修改":after"偽元素的CSS屬性?
    使用jQuery如何有效修改":after"偽元素的CSS屬性?
    在jquery中了解偽元素的限制:訪問“ selector 嘗試修改“:”選擇器的CSS屬性時,您可能會遇到困難。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    程式設計 發佈於2025-05-14
  • PHP陣列鍵值異常:了解07和08的好奇情況
    PHP陣列鍵值異常:了解07和08的好奇情況
    PHP數組鍵值問題,使用07&08 在給定數月的數組中,鍵值07和08呈現令人困惑的行為時,就會出現一個不尋常的問題。運行print_r($月份)返回意外結果:鍵“ 07”丟失,而鍵“ 08”分配給了9月的值。 此問題源於PHP對領先零的解釋。當一個數字帶有0(例如07或08)的前綴時,PHP...
    程式設計 發佈於2025-05-14
  • 如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    從python import codecs import codecs import codecs 導入 text = codecs.decode('這狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#帶有...
    程式設計 發佈於2025-05-14
  • PHP SimpleXML解析帶命名空間冒號的XML方法
    PHP SimpleXML解析帶命名空間冒號的XML方法
    在php 很少,請使用該限制很大,很少有很高。例如:這種技術可確保可以通過遍歷XML樹和使用兒童()方法()方法的XML樹和切換名稱空間來訪問名稱空間內的元素。
    程式設計 發佈於2025-05-14

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

Copyright© 2022 湘ICP备2022001581号-3