日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法基础:递归算法知识笔记

發(fā)布時(shí)間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法基础:递归算法知识笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、遞歸算法定義

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

簡單來說就是自己調(diào)用自己。直到達(dá)到退出遞歸的條件,則完成遞歸。

2、遞歸的步驟

1、找整個(gè)遞歸的終止條件:遞歸應(yīng)該在什么時(shí)候結(jié)束?

2、找返回值:應(yīng)該給上一級返回什么信息?

3、本級遞歸應(yīng)該做什么:在這一級遞歸中,應(yīng)該完成什么任務(wù)?

3、遞歸的優(yōu)點(diǎn)和缺點(diǎn)

優(yōu)點(diǎn):遞歸的核心思想就是將一個(gè)大問題,拆解成一個(gè)小問題,然后將小問題再次拆解,層層拆分從而簡化問題的實(shí)現(xiàn)。從而達(dá)到簡化重復(fù)的代碼讓程序變得更加簡潔。

缺點(diǎn):使用遞歸算法時(shí)每次方法的調(diào)用都需要在棧中開辟出一個(gè)空間保存相關(guān)數(shù)據(jù),頻繁的壓棧、彈棧會(huì)導(dǎo)致效率變低。

4、遞歸的案例

4.1 階乘的算法

? ? // 階乘的遞歸實(shí)現(xiàn)

? ? public static long f(int n){

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

? ? ? ? ? ? return 1;? ?

?

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

? ? }

4.2?斐波納契數(shù)列

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

在數(shù)學(xué)上,斐波納契數(shù)列以如下被以遞歸的方法定義: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); // 相同重復(fù)邏輯,縮小問題的規(guī)模

}

4.3 ?漢諾塔問題

/**?

* Title: 漢諾塔問題?

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

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

* 小盤在上。在移動(dòng)過程中可以利用B座。要求輸入層數(shù),運(yùn)算后輸出每步是如何移動(dòng)的。?

*?

?*/

public class HanoiTower {

?

? ? /**? ? ?

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

? ? ?* @author rico? ? ? ?

? ? ?* @param level:盤子的個(gè)數(shù)

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

? ? ?* @param inter 轉(zhuǎn)移盤子時(shí)用于中轉(zhuǎn)

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

? ? ?*/

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

?

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

? ? ? ? ? ? System.out.println("從" + from + " 移動(dòng)盤子" + level + " 號(hào)到" + to);

? ? ? ? } else {

? ? ? ? ? ? // 遞歸調(diào)用:將level-1個(gè)盤子從from移到inter(不是一次性移動(dòng),每次只能移動(dòng)一個(gè)盤子,其中to用于周轉(zhuǎn))

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

? ? ? ? ? ? // 將第level個(gè)盤子從A座移到C座

? ? ? ? ? ? System.out.println("從" + from + " 移動(dòng)盤子" + level + " 號(hào)到" + to);?

? ? ? ? ? ? // 遞歸調(diào)用:將level-1個(gè)盤子從inter移到to,from 用于周轉(zhuǎn)

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

? ? ? ? }

? ? }

?

? ? 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); // 遞歸求左子樹深度,縮小問題的規(guī)模

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

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

? ? }

?

?

?

IT技術(shù)分享社區(qū)

個(gè)人博客網(wǎng)站:https://programmerblog.xyz

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

?1、遞歸算法定義

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

簡單來說就是自己調(diào)用自己。直到達(dá)到退出遞歸的條件,則完成遞歸。

2、遞歸的步驟

1、找整個(gè)遞歸的終止條件:遞歸應(yīng)該在什么時(shí)候結(jié)束?

2、找返回值:應(yīng)該給上一級返回什么信息?

3、本級遞歸應(yīng)該做什么:在這一級遞歸中,應(yīng)該完成什么任務(wù)?

3、遞歸的優(yōu)點(diǎn)和缺點(diǎn)

優(yōu)點(diǎn):遞歸的核心思想就是將一個(gè)大問題,拆解成一個(gè)小問題,然后將小問題再次拆解,層層拆分從而簡化問題的實(shí)現(xiàn)。從而達(dá)到簡化重復(fù)的代碼讓程序變得更加簡潔。

缺點(diǎn):使用遞歸算法時(shí)每次方法的調(diào)用都需要在棧中開辟出一個(gè)空間保存相關(guān)數(shù)據(jù),頻繁的壓棧、彈棧會(huì)導(dǎo)致效率變低。

4、遞歸的案例

4.1 階乘的算法

? ? // 階乘的遞歸實(shí)現(xiàn)

? ? public static long f(int n){

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

? ? ? ? ? ? return 1;? ?

?

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

? ? }

4.2?斐波納契數(shù)列

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

在數(shù)學(xué)上,斐波納契數(shù)列以如下被以遞歸的方法定義: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); // 相同重復(fù)邏輯,縮小問題的規(guī)模

}

4.3 ?漢諾塔問題

/**?

* Title: 漢諾塔問題?

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

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

* 小盤在上。在移動(dòng)過程中可以利用B座。要求輸入層數(shù),運(yùn)算后輸出每步是如何移動(dòng)的。?

*?

?*/

public class HanoiTower {

?

? ? /**? ? ?

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

? ? ?* @author rico? ? ? ?

? ? ?* @param level:盤子的個(gè)數(shù)

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

? ? ?* @param inter 轉(zhuǎn)移盤子時(shí)用于中轉(zhuǎn)

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

? ? ?*/

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

?

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

? ? ? ? ? ? System.out.println("從" + from + " 移動(dòng)盤子" + level + " 號(hào)到" + to);

? ? ? ? } else {

? ? ? ? ? ? // 遞歸調(diào)用:將level-1個(gè)盤子從from移到inter(不是一次性移動(dòng),每次只能移動(dòng)一個(gè)盤子,其中to用于周轉(zhuǎn))

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

? ? ? ? ? ? // 將第level個(gè)盤子從A座移到C座

? ? ? ? ? ? System.out.println("從" + from + " 移動(dòng)盤子" + level + " 號(hào)到" + to);?

? ? ? ? ? ? // 遞歸調(diào)用:將level-1個(gè)盤子從inter移到to,from 用于周轉(zhuǎn)

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

? ? ? ? }

? ? }

?

? ? 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); // 遞歸求左子樹深度,縮小問題的規(guī)模

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

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

? ? }

?

?

?

IT技術(shù)分享社區(qū)

個(gè)人博客網(wǎng)站:https://programmerblog.xyz

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

?

總結(jié)

以上是生活随笔為你收集整理的算法基础:递归算法知识笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。