Java遞歸算法詳解(動(dòng)力節(jié)點(diǎn)整理)
遞歸算法是一種直接或者間接調(diào)用自身函數(shù)或者方法的算法。Java遞歸算法是基于Java語言實(shí)現(xiàn)的遞歸算法。遞歸算法的實(shí)質(zhì)是把問題分解成規(guī)模縮小的同類問題的子問題,然后遞歸調(diào)用方法來表示問題的解。遞歸算法對(duì)解決一大類問題很有效,它可以使算法簡(jiǎn)潔和易于理解。
遞歸算法解決問題的特點(diǎn):
1)遞歸就是方法里調(diào)用自身。
2) 在使用遞增歸策略時(shí),必須有一個(gè)明確的遞歸結(jié)束條件,稱為遞歸出口。
3)遞歸算法解題通常顯得很簡(jiǎn)潔,但遞歸算法解題的運(yùn)行效率較低。所以一般不提倡用遞歸算法設(shè)計(jì)程序。
4)在遞歸調(diào)用的過程當(dāng)中系統(tǒng)為每一層的返回點(diǎn)、局部量等開辟了棧來存儲(chǔ)。遞歸次數(shù)過多容易造成棧溢出等,所以一般不提倡用遞歸算法設(shè)計(jì)程序。
遞歸算法所體現(xiàn)的“重復(fù)”一般有三個(gè)要求:
一是每次調(diào)用在規(guī)模上都有所縮小(通常是減半);
二是相鄰兩次重復(fù)之間有緊密的聯(lián)系,前一次要為后一次做準(zhǔn)備(通常前一次的輸出就作為后一次的輸入);
三是在問題的規(guī)模極小時(shí)必須用直接給出解答而不再進(jìn)行遞歸調(diào)用,因而每次遞歸調(diào)用都是有條件的(以規(guī)模未達(dá)到直接解答的大小為條件),無條件遞歸調(diào)用將會(huì)成為死循環(huán)而不能正常結(jié)束。
為了理解遞歸算法,現(xiàn)舉一個(gè)實(shí)例說明如下:
問題描述:
求解Fibonacci數(shù)列的第10個(gè)位置的值?(斐波納契數(shù)列(Fibonacci Sequence),又稱黃金分割數(shù)列,指的是這樣一個(gè)數(shù)列:1、1、2、3、5、8、13、21、……在數(shù)學(xué)上,斐波納契數(shù)列以如下被以遞歸的方法定義:F0=0,F(xiàn)1=1,F(xiàn)n=F(n-1)+F(n-2)(n>=2,n∈N*))
Java代碼清單:
package com.bjpowernode.test; public classFab { public static void main(String args[]){ System.out.println(fab(5)); } private static int fab(int index){ if(index==1 || index==2){ return 1; }else{ return fab(index-1)+fab(index-2); } } }
程序分析:
這個(gè)實(shí)例是非常經(jīng)典的實(shí)例,主要是利用遞歸實(shí)現(xiàn)了Fibonacci數(shù)列。這個(gè)遞歸算法的出口是在
if(index==1 || index==2){ return 1; }
這個(gè)代碼段上,如果程序的index符合條件就會(huì)停止進(jìn)行遞歸。所以這個(gè)程序的運(yùn)行流程是:
程序分析到這里,遞歸的實(shí)現(xiàn)也就完成了,讀者可以自己簡(jiǎn)單的做個(gè)demo,感受一下這個(gè)算法的精妙之處,其實(shí)很多人都在說算法難,難于上青天,其實(shí)掌握算法的根才是最重要的,什么是算法的根呢,就拿這個(gè)遞歸算法來說吧,我感覺這個(gè)根就是那個(gè)出口,只要找到這個(gè)出口所在,那么算法自然而然就能水到渠成了。
以上所述是小編給大家介紹的Java遞歸算法詳解(動(dòng)力節(jié)點(diǎn)整理),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
@Transactional注解異常報(bào)錯(cuò)之多數(shù)據(jù)源詳解
這篇文章主要介紹了@Transactional注解異常報(bào)錯(cuò)之多數(shù)據(jù)源詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Java圖形化界面設(shè)計(jì)之布局管理器之BorderLayout案例詳解
這篇文章主要介紹了Java圖形化界面設(shè)計(jì)之布局管理器之BorderLayout案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Java遞歸實(shí)現(xiàn)斐波那契數(shù)列
這篇文章主要為大家詳細(xì)介紹了Java遞歸實(shí)現(xiàn)斐波那契數(shù)列,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02java中JSONArray互相轉(zhuǎn)換List的實(shí)現(xiàn)
本文主要介紹了java中JSONArray互相轉(zhuǎn)換List的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07使用java實(shí)現(xiàn)備份和恢復(fù)SQLServer表數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了如何使用java實(shí)現(xiàn)備份和恢復(fù)SQLServer表數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01mybatis-plus多表分頁查詢最佳實(shí)現(xiàn)方法(非常簡(jiǎn)單)
這篇文章主要給大家介紹了關(guān)于mybatis-plus多表分頁查詢最佳實(shí)現(xiàn)方法,文中介紹的方法非常簡(jiǎn)單,MyBatis-Plus中分頁查詢是比較方便的,這個(gè)功能在網(wǎng)站中也是非常常用的,這方面的知識(shí)點(diǎn)是必備的知識(shí)點(diǎn),需要的朋友可以參考下2023-08-08SpringBoot?thymeleaf實(shí)現(xiàn)餅狀圖與柱形圖流程介紹
這篇文章主要介紹了SpringBoot?thymeleaf實(shí)現(xiàn)餅狀圖與柱形圖流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12基于SpringBoot+Redis的Session共享與單點(diǎn)登錄詳解
這篇文章主要介紹了基于SpringBoot+Redis的Session共享與單點(diǎn)登錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07