算法基礎:遞歸算法知識筆記

1、遞歸算法定義

遞歸算法是將重復問題分解為同類的子問題而解決問題的方法,其核心思想是分治策略。

簡單來說就是自己調用自己。直到達到退出遞歸的條件,則完成遞歸。

2、遞歸的步驟

1、找整個遞歸的終止條件:遞歸應該在什么時候結束?

2、找返回值:應該給上一級返回什么信息?

3、本級遞歸應該做什么:在這一級遞歸中,應該完成什么任務?

3、遞歸的優點和缺點

優點:遞歸的核心思想就是將一個大問題,拆解成一個小問題,然后將小問題再次拆解,層層拆分從而簡化問題的實現。從而達到簡化重復的代碼讓程序變得更加簡潔。

缺點:使用遞歸算法時每次方法的調用都需要在棧中開辟出一個空間保存相關數據,頻繁的壓棧、彈棧會導致效率變低。

4、遞歸的案例

4.1 階乘的算法

? ? // 階乘的遞歸實現

? ? public static long f(int n){

? ? ? ? if(n == 1)? ?// 結束遞歸終止條件?

? ? ? ? ? ? return 1;? ?

?

? ? ? ? return n*f(n-1);? // 相同重復邏輯,縮小問題的規模

? ? }

4.2?斐波納契數列

斐波納契數列,又稱黃金分割數列,指的是這樣一個數列:1、1、2、3、5、8、13、21、……

在數學上,斐波納契數列以如下被以遞歸的方法定義:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)。

public static int fibonacci(int n) {

? ? ? ? if (n == 1 || n == 2) {? ? ?// 遞歸終止條件

? ? ? ? ? ? return 1;? ? ? ?// 簡單情景

? ? ? ? }

? ? ? ? return fibonacci(n - 1) + fibonacci(n - 2); // 相同重復邏輯,縮小問題的規模

}

4.3 ?漢諾塔問題

/**?

* Title: 漢諾塔問題?

* Description:古代有一個梵塔,塔內有三個座A、B、C,A座上有64個盤子,盤子大小不等,大的在下,小的在上。?

* 有一個和尚想把這64個盤子從A座移到C座,但每次只能允許移動一個盤子,并且在移動過程中,3個座上的盤子始終保持大盤在下,?

* 小盤在上。在移動過程中可以利用B座。要求輸入層數,運算后輸出每步是如何移動的。?

*?

?*/

public class HanoiTower {

?

? ? /**? ? ?

? ? ?* @description 在程序中,我們把最上面的盤子稱為第一個盤子,把最下面的盤子稱為第N個盤子

? ? ?* @author rico? ? ? ?

? ? ?* @param level:盤子的個數

? ? ?* @param from 盤子的初始地址

? ? ?* @param inter 轉移盤子時用于中轉

? ? ?* @param to 盤子的目的地址

? ? ?*/

? ? public static void moveDish(int level, char from, char inter, char to) {

?

? ? ? ? if (level == 1) { // 遞歸終止條件

? ? ? ? ? ? System.out.println("從" + from + " 移動盤子" + level + " 號到" + to);

? ? ? ? } else {

? ? ? ? ? ? // 遞歸調用:將level-1個盤子從from移到inter(不是一次性移動,每次只能移動一個盤子,其中to用于周轉)

? ? ? ? ? ? moveDish(level - 1, from, to, inter); // 遞歸調用,縮小問題的規模

? ? ? ? ? ? // 將第level個盤子從A座移到C座

? ? ? ? ? ? System.out.println("從" + from + " 移動盤子" + level + " 號到" + to);?

? ? ? ? ? ? // 遞歸調用:將level-1個盤子從inter移到to,from 用于周轉

? ? ? ? ? ? moveDish(level - 1, inter, from, to); // 遞歸調用,縮小問題的規模

? ? ? ? }

? ? }

?

? ? public static void main(String[] args) {

? ? ? ? int nDisks = 30;

? ? ? ? moveDish(nDisks, 'A', 'B', 'C');

? ? }

4.4 二叉樹深度?

public static int getTreeDepth(Tree t) {?

? ? ? ? // 樹為空

? ? ? ? if (t == null) // 遞歸終止條件

? ? ? ? ? ? return 0;?

? ? ? ? int left = getTreeDepth(t.left); // 遞歸求左子樹深度,縮小問題的規模

? ? ? ? int right = getTreeDepth(t.left); // 遞歸求右子樹深度,縮小問題的規模?

? ? ? ? return left > right ? left + 1 : right + 1;

? ? }

?

?

?

IT技術分享社區

個人博客網站:https://programmerblog.xyz

文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識

?1、遞歸算法定義

遞歸算法是將重復問題分解為同類的子問題而解決問題的方法,其核心思想是分治策略。

簡單來說就是自己調用自己。直到達到退出遞歸的條件,則完成遞歸。

2、遞歸的步驟

1、找整個遞歸的終止條件:遞歸應該在什么時候結束?

2、找返回值:應該給上一級返回什么信息?

3、本級遞歸應該做什么:在這一級遞歸中,應該完成什么任務?

3、遞歸的優點和缺點

優點:遞歸的核心思想就是將一個大問題,拆解成一個小問題,然后將小問題再次拆解,層層拆分從而簡化問題的實現。從而達到簡化重復的代碼讓程序變得更加簡潔。

缺點:使用遞歸算法時每次方法的調用都需要在棧中開辟出一個空間保存相關數據,頻繁的壓棧、彈棧會導致效率變低。

4、遞歸的案例

4.1 階乘的算法

? ? // 階乘的遞歸實現

? ? public static long f(int n){

? ? ? ? if(n == 1)? ?// 結束遞歸終止條件?

? ? ? ? ? ? return 1;? ?

?

? ? ? ? return n*f(n-1);? // 相同重復邏輯,縮小問題的規模

? ? }

4.2?斐波納契數列

斐波納契數列,又稱黃金分割數列,指的是這樣一個數列:1、1、2、3、5、8、13、21、……

在數學上,斐波納契數列以如下被以遞歸的方法定義:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)。

public static int fibonacci(int n) {

? ? ? ? if (n == 1 || n == 2) {? ? ?// 遞歸終止條件

? ? ? ? ? ? return 1;? ? ? ?// 簡單情景

? ? ? ? }

? ? ? ? return fibonacci(n - 1) + fibonacci(n - 2); // 相同重復邏輯,縮小問題的規模

}

4.3 ?漢諾塔問題

/**?

* Title: 漢諾塔問題?

* Description:古代有一個梵塔,塔內有三個座A、B、C,A座上有64個盤子,盤子大小不等,大的在下,小的在上。?

* 有一個和尚想把這64個盤子從A座移到C座,但每次只能允許移動一個盤子,并且在移動過程中,3個座上的盤子始終保持大盤在下,?

* 小盤在上。在移動過程中可以利用B座。要求輸入層數,運算后輸出每步是如何移動的。?

*?

?*/

public class HanoiTower {

?

? ? /**? ? ?

? ? ?* @description 在程序中,我們把最上面的盤子稱為第一個盤子,把最下面的盤子稱為第N個盤子

? ? ?* @author rico? ? ? ?

? ? ?* @param level:盤子的個數

? ? ?* @param from 盤子的初始地址

? ? ?* @param inter 轉移盤子時用于中轉

? ? ?* @param to 盤子的目的地址

? ? ?*/

? ? public static void moveDish(int level, char from, char inter, char to) {

?

? ? ? ? if (level == 1) { // 遞歸終止條件

? ? ? ? ? ? System.out.println("從" + from + " 移動盤子" + level + " 號到" + to);

? ? ? ? } else {

? ? ? ? ? ? // 遞歸調用:將level-1個盤子從from移到inter(不是一次性移動,每次只能移動一個盤子,其中to用于周轉)

? ? ? ? ? ? moveDish(level - 1, from, to, inter); // 遞歸調用,縮小問題的規模

? ? ? ? ? ? // 將第level個盤子從A座移到C座

? ? ? ? ? ? System.out.println("從" + from + " 移動盤子" + level + " 號到" + to);?

? ? ? ? ? ? // 遞歸調用:將level-1個盤子從inter移到to,from 用于周轉

? ? ? ? ? ? moveDish(level - 1, inter, from, to); // 遞歸調用,縮小問題的規模

? ? ? ? }

? ? }

?

? ? public static void main(String[] args) {

? ? ? ? int nDisks = 30;

? ? ? ? moveDish(nDisks, 'A', 'B', 'C');

? ? }

4.4 二叉樹深度?

public static int getTreeDepth(Tree t) {?

? ? ? ? // 樹為空

? ? ? ? if (t == null) // 遞歸終止條件

? ? ? ? ? ? return 0;?

? ? ? ? int left = getTreeDepth(t.left); // 遞歸求左子樹深度,縮小問題的規模

? ? ? ? int right = getTreeDepth(t.left); // 遞歸求右子樹深度,縮小問題的規模?

? ? ? ? return left > right ? left + 1 : right + 1;

? ? }

?

?

?

IT技術分享社區

個人博客網站:https://programmerblog.xyz

文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識

?

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

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

相關文章

ttl繼承邏輯門的邏輯功能與參數測試 實驗總結_LMS電聲測試儀,LMS-V測試系統,精聲電聲...

LMS-V測試系統LMS揚聲器測試儀從推出到現在25年的時間,在全世界被很多揚聲器開發與制造廠家廣泛應用研發與生產質量控制,傳統的LMS揚聲器測試儀采用ISA卡的形式提供,所以面臨著越來越多的零件過時,所以為了徹底解決這些問題&#…

android自動讓輸入框上劃,Android界面技巧:當輸入法調出時,如何讓界面自動上移,使輸入法不會遮擋到主界面(Activity)...

android:windowSoftInputModeactivity主窗口與軟鍵盤的交互模式,可以用來避免輸入法面板遮擋問題,Android1.5后的一個新特性。這個屬性能影響兩件事情:【一】當有焦點產生時,軟鍵盤是隱藏還是顯示【二】是否減少活動主窗口大小以便…

java中break標記的使用

筆試題目&#xff1a;break目前位于內層的for循環&#xff0c;如何才能讓break作用于外層 的for循環。可以標記解決 標記的命名只要符合標識符的命名規則即可。 Test public void test2(){aaa:for(int j 0 ; j<3 ; j){ // j0 外層for循環for(int i 0 ; i< 2 ; i){ //…

六月計劃#2B(6.10-6.16)

4/7 STL set 數學 快速傅立葉(FFT)高斯消元動態規劃 斜率優化轉載于:https://www.cnblogs.com/Sunnie69/p/5573299.html

電腦基礎知識入門:鍵盤上的英文,意思和功能匯總!

電腦鍵盤是把文字信息的控制信息輸入電腦的通道&#xff0c;從英文打字機的鍵盤演變而來的。它最早出現在電腦上的時候&#xff0c;還是一種叫做“電傳打字機”的部件。那些陌生的鍵盤按鍵都有什么用途?很多孩子不知道鍵盤上功能鍵和字母數字鍵以外的鍵盤按鍵有什么用&#xf…

elementui el-dialog 離頂部的位置_駐馬店建筑物避雷帶的安裝位置,本月報價

首頁 > 新聞中心發布時間&#xff1a;2020-11-06 18:23:42 導讀&#xff1a;科杰防雷為您提供駐馬店建筑物避雷帶的安裝位置的相關知識與詳情&#xff1a; 該系統在正常運行時&#xff0c;不管三相負荷平衡不平衡&#xff0c;在中性線N帶電情況下&#xff0c;PE線不會帶電。…

android 彈出框帶標題欄,Android開發靠標題欄的彈框

一、效果圖title_dialog.png二、思路首先它是一個彈框&#xff0c;只是彈框的布局做些處理&#xff0c;布局占滿屏幕&#xff0c;只有需要白色的布局的背景設為白色。其他沒設置背景顏色&#xff0c;自然用dialog的style的windowBackground三、案例關鍵代碼dialog的xmlxmlns:ap…

算法基礎:圖的相關算法知識筆記

一、圖的相關算法1、圖的分類知識如下圖&#xff1a;2、生成樹概念對連通圖進行遍歷&#xff0c;過程中所經過的邊和頂點的組合可看做是一棵普通樹&#xff0c;通常稱為生成樹。連通圖的生成樹具有這樣的特征&#xff1a;邊的數量 頂點數 - 13、最小生成樹在連通網的所有生成樹…

下午回來才后知百密于一疏忽

交了1700定金后就去了中介公司看了一下&#xff0c;比較偏僻窄小&#xff0c;然后里面有一些人和辦公桌比較擠&#xff0c;中介“董楠楠”介紹了一下女經理&#xff0c;然后就做地鐵回了&#xff0c;中途記憶&#xff0c;沒有冰箱然后統一口徑&#xff0c;對于只有一個電磁爐的…

java中break和continue的用法例子

break用于switch語句 1. break用于switch語句中&#xff0c;終止switch語句 下面先看 加上break,效果如下 我們可以看到&#xff0c;沒有用過break關鍵字時&#xff0c;不會在判斷下一個case的值&#xff0c;直接向后運行&#xff0c;直到遇到break&#xff0c;或者整體swit…

ftp 工具_ftp工具,ftp工具有哪些

對于ftp工具&#xff0c;你了解多少&#xff1f;其實一般人也接觸不到這種軟件。ftp工具主要是針對從事網站管理的工作人員比較有利的一款工具。可以幫助他們快速的解決工作中的問題。方便、簡單、快捷又明了的解決問題。那ftp工具有哪些呢&#xff1f;接下來給大家推薦四款好用…

盤點世界十大軟件外包公司排名是哪些公司

排名第一:IBMIBM,總部在紐約的阿蒙克。托馬斯沃森19世紀80年代在美國成立,是全球最大的信息技術和商業解決方案公司,在全球擁有超過30萬名員工,業務遍及160多個國家和地區。電腦上的制作非常出名,事實上,IBM在軟件方面取得了巨大的成就,特別是在一些IBM服務器上使用的軟件平臺上…

判斷不為空和不為空串的方法java

判斷不為空和不為空串的方法 方法一:用StringUtils工具類 首先要引入依賴 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId> </dependency> if( StringUtils.isNotBlank(str3) && St…

android xml事件,安卓事件

1、自定義內部類2、匿名內部類3、當前activity去實現事件接口4、在布局文件xml中添加點擊事件屬性(使用頻率非常高)補充&#xff1a;a、Android 在xml文件中 給某個控件聲明 id 是: "/自定義名字" &#xff0c;獲取是&#xff1a; "/自定義的名字" &#x…

Cocos2d-x v3.0物理系統 利用PhysicsEditor創建多邊形

Cocos2d-x 3.0的新物理系統我就不必多說了&#xff0c;接觸一段時間&#xff0c;感覺還是不錯的。對于那些基本概念&#xff0c;網上的教程已經泛濫了&#xff0c;就不多說了&#xff0c;不過對于創建多邊形物體的教程&#xff0c;還真不多&#xff0c;很多都是創建圓形和矩形&…

公眾號開發 單獨 給某個用戶 推送消息_韓國5G用戶6月底已達134萬 較5月底增加近70%...

中關村在線消息&#xff1a;韓國三大運營商SK、KT和LG率先于去年12月開始向企業用戶提供商用5G 服務&#xff0c;今年4月初推出面向個人消費者的5G民用服務。韓國作為全球首個推出5G 服務的國家&#xff0c;他們的5G用戶數量在6月時已經突破100萬大關。日前韓國公布6月底最新的…

程序語言的概念知識筆記

1、低級語言和高級語言 計算機指令程序&#xff1a;0、1 組成的機器指令序列。特點&#xff1a;效率低、可讀性差、難以維護。 匯編指令&#xff1a;用常用的符號代替0、1 序列來 表示機器指令&#xff0c;例如用ADD表示加法。 高級語言&#xff1a;面向對象設計的各類應用的程…

java lambda 表達式中的雙冒號和箭頭的用法 ::

先構造一些數據,創建一個User類 java lambda 表達式中的雙冒號的用法 &#xff1a;&#xff1a; 雙冒號運算就是Java中的[方法引用],[方法引用]的格式是 類名::方法名 如下圖所示 User是一個類, getAge是方法名,注意是方法名呀&#xff0c;后面沒有括號()的。為什么不要括號…

android 麥克風耳機,Android force AudioRecord使用耳機麥克風

我使用AudioRecord來錄制音樂&#xff0c;但是當我錄制它時使用手機麥克風。 我該如何強迫他使用耳機的頻道&#xff1f;Android force AudioRecord使用耳機麥克風我用這個代碼&#xff1a;int minSize AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, Audi…

linux內核設計與實現 中文第三版 pdf_大牛推薦的5本 Linux 經典必讀書

今天給大家推薦5本Linux學習相關的書籍&#xff1b;這些書籍基本都是很多大牛推薦過&#xff0c;并且深受業界好評的書&#xff1b;雖然只有5本&#xff0c;但是相信把5本全都認真看過的同學應該不多吧&#xff1f;希望這些書能夠幫助你進階為大牛&#xff01;5.《鳥哥的 Linux…