Java方法的遞歸

Java方法的遞歸

  • 前言
  • 一、遞歸的概念
    • 示例
    • 代碼示例
  • 二、遞歸執行過程分析
    • 代碼示例
    • 執行過程圖
  • 三、遞歸練習
    • 代碼示例
      • 按順序打印一個數字的每一位(例如 1234 打印出 1 2 3 4)
      • 遞歸求 1 + 2 + 3 + ... + 10
      • 寫一個遞歸方法,輸入一個非負整數,返回組成它的數字之和. 例如,輸入 1729, 則應該返回1+7+2+9,它的和是19
      • 求斐波那契數列的第 N 項
        • 斐波那契數列介紹


前言

Java方法的遞歸是指一個Java方法直接或間接地調用自身,以完成重復或嵌套的計算任務。遞歸常用于處理具有自相似性的問題,通過分解問題為更小、更簡單的子問題來解決整個問題。遞歸方法需要明確定義遞歸終止條件,以防止無限循環。


一、遞歸的概念

一個方法在執行過程中調用自身, 就稱為 “遞歸”.

遞歸相當于數學上的 “數學歸納法”, 有一個起始條件, 然后有一個遞推公式.

遞歸是一種在方法內調用自身的編程技術。在使用遞歸時,方法會重復調用自身,每次調用時傳遞不同的參數,直到滿足某個終止條件為止。

遞歸可以用于解決一些問題,特別是那些具有遞歸結構的問題。在這些問題中,解決方案可以通過將問題分解為更小的子問題來實現。每次遞歸調用都會處理一個子問題,直到達到基本情況,然后將子問題的解決方案組合起來得到原始問題的解決方案。

遞歸要求在每次調用時,傳遞給遞歸方法的參數應該與原始問題的參數有關,但規模更小。這樣可以確保遞歸在每次調用時朝著基本情況前進,并最終達到終止條件。

遞歸的基本思想是將一個大問題分解為一個或多個相同類型的小問題,然后解決每個小問題,并將它們的解決方案組合起來得到原始問題的解決方案。遞歸方法必須有一個基本情況,以便在基本情況下終止遞歸調用。

在Java中,遞歸可以用于解決各種問題,例如計算階乘、斐波那契數列、遍歷樹等。但需要注意的是,遞歸可能會導致棧溢出的錯誤,因為每次遞歸調用都會將方法的調用信息存儲在棧中。因此,遞歸需要謹慎使用,并確保有適當的終止條件。

示例

求 N!

起始條件: N = 1 的時候, N! 為 1. 這個起始條件相當于遞歸的結束條件.

遞歸公式: 求 N! , 直接不好求, 可以把問題轉換成 N! => N * (N-1)!

代碼示例

遞歸求 N 的階乘

class Main{public static void main(String[] args) {int n = 5;int ret = factor(n);System.out.println("ret = " + ret);}public static int factor(int n) {if (n == 1) {return 1;}return n * factor(n - 1); // factor 調用函數自身}
}

在這里插入圖片描述

二、遞歸執行過程分析

遞歸的程序的執行過程不太容易理解, 要想理解清楚遞歸, 必須先理解清楚 “方法的執行過程”, 尤其是 “方法執行結束之后, 回到調用位置繼續往下執行”.

代碼示例

遞歸求 N 的階乘, 加上日志版本

class Main{public static void main(String[] args) {int n = 5;int ret = factor(n);System.out.println("ret = " + ret);}public static int factor(int n) {System.out.println("函數開始, n = " + n);if (n == 1) {System.out.println("函數結束, n = 1 ret = 1");return 1;}int ret = n * factor(n - 1);System.out.println("函數結束, n = " + n + " ret = " + ret);return ret;}
}

在這里插入圖片描述

執行過程圖

在這里插入圖片描述
程序按照序號中標識的 (1) -> (8) 的順序執行.

關于 “調用棧”

方法調用的時候, 會有一個 “棧” 這樣的內存空間描述當前的調用關系. 稱為調用棧.

每一次的方法調用就稱為一個 “棧幀”, 每個棧幀中包含了這次調用的參數是哪些, 返回到哪里繼續執行等信息.

三、遞歸練習

代碼示例

按順序打印一個數字的每一位(例如 1234 打印出 1 2 3 4)

public static void print(int num) {if (num > 9) {print(num / 10);}System.out.println(num % 10);}

遞歸求 1 + 2 + 3 + … + 10

public static int sum(int num) {if (num == 1) {return 1;}return num + sum(num - 1);}

寫一個遞歸方法,輸入一個非負整數,返回組成它的數字之和. 例如,輸入 1729, 則應該返回1+7+2+9,它的和是19

public static int sum(int num) {if (num < 10) {return num;}return num % 10 + sum(num / 10);}

求斐波那契數列的第 N 項

斐波那契數列介紹

斐波那契數列是一個數學上的數列,其形式為 1, 1, 2, 3, 5, 8, 13, 21, 34, …。數列中的每個數字都是前面兩個數字之和。也就是說,第三個數字是前兩個數字之和,第四個數字是前兩個數字之和,以此類推。

斐波那契數列最早由13世紀的意大利數學家斐波那契(Fibonacci)發現和研究,他在其著作《算盤書》中介紹了這個數列,并將其應用于兔子繁殖的模型中。

斐波那契數列在數學中有著重要的應用和性質。它在自然界中也有許多出現的現象,例如植物的葉子排列、螺旋殼的形狀等都可以用斐波那契數列來描述。

斐波那契數列也有一些有趣的特性,例如當數列中的數字趨近無窮時,相鄰兩個數字的比值會趨近于黃金分割比例0.618。這個黃金分割比例在藝術和設計中也有廣泛的應用。

斐波那契數列除了以上的介紹,還有其他的許多性質和應用,它在數學中被廣泛研究和討論。

public static int fib(int n) {if (n == 1 || n == 2) {return 1;}return fib(n - 1) + fib(n - 2);}

當我們求 ?b(40) 的時候發現, 程序執行速度極慢. 原因是進行了大量的重復運算.

class Main {public static int count = 0; // 這個是類的成員變量. 后面會詳細介紹到.public static void main(String[] args) {System.out.println(fib(40));System.out.println(count);}public static int fib(int n) {if (n == 1 || n == 2) {return 1;}if (n == 3) {count++;}return fib(n - 1) + fib(n - 2);}
}

在這里插入圖片描述
可以使用循環的方式來求斐波那契數列問題, 避免出現冗余運算.

class Main {public static int count = 0; // 這個是類的成員變量. 后面會詳細介紹到.public static void main(String[] args) {System.out.println(fib(40));System.out.println(count);}public static int fib(int n) {int last2 = 1;int last1 = 1;int cur = 0;for (int i = 3; i <= n; i++) {cur = last1 + last2;last2 = last1;last1 = cur;}return cur;}}

在這里插入圖片描述


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13887.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13887.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13887.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

零基礎學Java第二十一天之IIO流之對象流

IO流之對象流 1、對象流 1、理解 將對象寫入到文件&#xff0c;將文件里的對象讀取到程序中 class ObjectInputStream – 對象輸入流 class ObjectOutputStream – 對象輸出流 序列化/鈍化&#xff1a;程序里的對象 寫入到 文件中 反序列化/活化&#xff1a;文件中的對象 讀取…

【OpenCV實戰】OpenCV實現自動調整亮度和對比度

一,基于局部直方圖信息增強算法 對比度受限的自適應直方圖均衡化(Contrast Limited Adaptive Histogram Equalization,簡稱CLAHE)是一種用于圖像增強的技術,其原理主要基于自適應直方圖均衡化(Adaptive Histogram Equalization,簡稱AHE)但增加了對比度限制來避免過度放…

uniapp藍牙打印圖片

前言 這是個藍牙打印圖片的功能&#xff0c;業務是打印界面固定的demo范圍&#xff0c;這里通過html2canvas插件生成的圖片base64&#xff0c;然后圖片base64繪制到canvas中去后&#xff0c;獲取canvas中的像素信息&#xff0c;然后對像素信息進行一個灰度值處理&#xff0c;灰…

在Linux系統中解決Java生成海報文字亂碼和缺少字體文件的問題

在Linux系統中,如果缺少特定的字體文件,可以通過以下幾種方法來解決: 1. 安裝系統字體包 大多數Linux發行版提供了各種字體包,可以通過包管理器安裝這些字體包。例如,在Debian/Ubuntu系統上,可以使用以下命令安裝常見的字體包: # 安裝基本的字體包 sudo apt-get updat…

Java集合的組內平均值怎么計算

要計算Java集合&#xff08;例如List或Set中的Integer、Double或其他數值類型的對象&#xff09;的組內平均值&#xff0c;我們需要遍歷這個集合&#xff0c;累加所有的元素值&#xff0c;然后除以集合的大小&#xff08;即元素的數量&#xff09;。以下是一個詳細的步驟說明和…

opencl色域變換,處理傳遞顯存數據

在使用ffmpeg解碼后的多路解碼數據非常慢&#xff0c;還要給AI做行的加速方式是在顯存處理數據&#xff0c;在視頻拼接融合產品的產品與架構設計中&#xff0c;提出了比較可靠的方式是使用cuda&#xff0c;那么沒有cuda的顯卡如何處理呢 &#xff0c;比較好的方式是使用opencl來…

go語言的一些常見踩坑問題

開始之前&#xff0c;介紹一下?最近很火的開源技術&#xff0c;低代碼。 作為一種軟件開發技術逐漸進入了人們的視角里&#xff0c;它利用自身獨特的優勢占領市場一角——讓使用者可以通過可視化的方式&#xff0c;以更少的編碼&#xff0c;更快速地構建和交付應用軟件&#…

安卓手機APP開發__網絡連接性支持VPN

安卓手機APP開發__網絡連接性支持VPN 安卓提供了API給開發者,來創建一個虛擬的私有網絡(VPN)的解決方案. 根據這里的介紹,你能知道如何開發和測試你的針對安卓設備的VPN的客戶端. 概述 VPN允許設備為了安全地連接網絡,而沒有物理性的連接在一個網絡上. 安卓包括了一個內嵌的…

【無重復字符的最長子串】python,滑動窗口+哈希表

滑動窗口哈希表 哈希表 seen 統計&#xff1a; 指針 j遍歷字符 s&#xff0c;哈希表統計字符 s[j]最后一次出現的索引 。 更新左指針 i &#xff1a; 根據上輪左指針 i 和 seen[s[j]]&#xff0c;每輪更新左邊界 i &#xff0c;保證區間 [i1,j] 內無重復字符且最大。 更新結…

使用JSDOM安全截斷文章HTML內容

在Web開發中&#xff0c;經常需要處理大量的HTML內容&#xff0c;尤其是在展示文章預覽、動態加載內容或限制顯示長度等場景中。直接截斷HTML字符串可能會導致頁面布局混亂、樣式錯誤或標簽不完整等問題。為了安全地截斷HTML內容&#xff0c;我們可以利用jsdom庫來解析HTML&…

JVM學習-垃圾回收器(一)

垃圾回收器 按線程數分類 串行垃圾回收器 串行回收是在同一時間段內只允許有一個CPU用于執行垃圾回收操作&#xff0c;此時工作線程被暫停&#xff0c;直至垃圾收集工作結束 在諸如單CPU處理器或者較小的應用內存等硬件平臺不是特別優越的場合&#xff0c;串行回收器的性能表…

http和https的區別,怎么免費實現https(內涵教學)

超文本傳輸協議HTTP協議被用于在Web瀏覽器和網站服務器之間傳遞信息&#xff0c;HTTP協議以明文方式發送內容&#xff0c;不提供任何方式的數據加密&#xff0c;如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文&#xff0c;就可以直接讀懂其中的信息&#xff0c;因此&…

etcd 和 MongoDB 的混沌(故障注入)測試方法

最近在對一些自建的數據庫 driver/client 基礎庫的健壯性做混沌&#xff08;故障&#xff09;測試, 去驗證了解業務的故障處理機制和恢復時長. 主要涉及到了 MongoDB 和 etcd 這兩個基礎組件. 本文會介紹下相關的測試方法. MongoDB 中的故障測試 MongoDB 是比較世界上熱門的文…

AI網絡爬蟲:批量爬取電視貓上面的《慶余年》分集劇情

電視貓上面有《慶余年》分集劇情&#xff0c;如何批量爬取下來呢&#xff1f; 先找到每集的鏈接地址&#xff0c;都在這個class"epipage clear"的div標簽里面的li標簽下面的a標簽里面&#xff1a; <a href"/drama/Yy0wHDA/episode">1</a> 這個…

速盾:負載均衡能防ddos攻擊嗎?

負載均衡是一種分布式系統的設計思想&#xff0c;通過將流量分散到多個服務器上&#xff0c;以提高系統的穩定性和可擴展性。然而&#xff0c;負載均衡本身并不能完全防止DDoS攻擊&#xff0c;但可以在一定程度上減輕其影響。 DDoS&#xff08;分布式拒絕服務&#xff09;攻擊…

【C語言】8.C語言操作符詳解(1)

文章目錄 1.操作符的分類2.?進制和進制轉換3.原碼、反碼、補碼4.移位操作符4.1 左移操作符4.2 右移操作符 5.位操作符&#xff1a;&、|、^、~5.1 &&#xff1a;按位與5.2 |&#xff1a;按位或5.3 ^&#xff1a;按位異或5.4 ~&#xff1a;按位取反5.5 例題例題1例題2例…

短視頻矩陣系統4年獨立開發正規代發布接口源碼搭建部署開發

1. 短視頻矩陣源碼技術開發要求及實現流程&#xff1a; 短視頻矩陣源碼開發要求具備視頻錄制、編輯、剪輯、分享等基本功能&#xff0c;支持實時濾鏡、特效、音樂等個性化編輯&#xff0c;能夠實現高效的視頻渲染和處理。開發流程主要包括需求分析、技術選型、設計架構、編碼實…

Web前端開發技術、詳細文章、(例子)html 列表、有序列表、無序列表、列表嵌套

目錄 列表概述 列表類型與標記符號 無序列表 語法&#xff1a; 語法說明&#xff1a; 無序列表標記的 type 屬性及其說明 代碼解釋 有序列表 基本語法 屬性說明 1、列表 o1標記的屬性 2、列表項li標記的屬性 有序列表 o1標記的屬性、值 代碼解釋 列表嵌套 基本…

如何將Qt pro工程文件 改成CMakeLists.txt

Qt pro工程管理文件&#xff0c;本人認為是很好用的&#xff0c;語法簡潔易懂&#xff0c;但是只能在QtCreator中使用&#xff0c;想用使用其它IDE比如Clion或者vs&#xff0c;CMakeLists是種通用的選擇&#xff0c;另外QtCreator的調試功能跟粑粑一樣。 一&#xff0c;思路 …

FreeBSD/Linux下的系統資源監視器排隊隊

bpytop bpytop 是一個基于 Python 的資源監視器&#xff0c;可以在 FreeBSD 上使用。它提供了對文件寫入磁盤、網絡、CPU 和內存占用的監視功能。 pkg install bpytop 或者用ports安裝 cd /usr/ports/sysutils/bpytop/ make install clean bashtop bashtop 也是一個基于 P…