什么是递归?递归的理解
一.什么是遞歸?
????????遞歸,就是在運行的過程中不斷地調(diào)用自己。遞歸有兩個過程,簡單的說一個是遞的過程,一個是歸的過程。簡單用代碼來理解:
public void fun(參數(shù)) {if (終止條件) {return;}fun(參數(shù));(其他判斷條件或語句); }? ? ?? 在上邊代碼中,當?shù)谝淮芜M入函數(shù)時,先判斷是否符合終止條件,符合則直接結(jié)束函數(shù),不符合入下一語句,調(diào)用自己重新進入下一層自身函數(shù),(注意這是最外一層將不向下繼續(xù)執(zhí)行語句,外層卡在fun(參數(shù)處)),這個調(diào)用自己進入自身函數(shù)的操作過程即為“遞”的過程。假設(shè)進入下一層后符合終止條件,返回結(jié)果,此時之前進入自身函數(shù)執(zhí)行完成返回最外一層函數(shù),最外一層函數(shù)遞歸調(diào)用處得到結(jié)果,(即內(nèi)層函數(shù)執(zhí)行完成得到結(jié)果返回值),這個過程即為“歸”的過程。這時最外一層函數(shù)才能繼續(xù)執(zhí)行下一語句,直至函數(shù)運行完成。
二.判斷遞歸使用的場景
1.大問題可以拆分為多個子問題。
2.原問題和拆分后的子問題除了數(shù)據(jù)規(guī)模不同,解決思路完全相同。
3.存在遞歸終止條件。
遞歸在線性數(shù)據(jù)結(jié)構(gòu)中使用不太明顯,迭代基本可以很容易的解決問題。
遞歸在非線性結(jié)構(gòu)中非常重要,比如二叉樹,回溯,典型的樹形問題-九宮格字母組合
三.遞歸代碼的寫法,(一定要注意方法的語義)
遞歸必須具備兩個條件,
一是有邊界,即終止條件。
二是需要調(diào)用自己。
這兩個條件缺一不可,并且其中終止條件語句必須在遞歸調(diào)用語句之前。如果順序顛倒則遞歸函數(shù)會進入死循環(huán),永遠退不出來,會出現(xiàn)堆棧溢出異常(StackOverflowError)。
在遞歸函數(shù)中,終止條件可以不只一個,遞歸調(diào)用也可以通過一些邏輯語句分成好幾個。
三.講一個簡單且經(jīng)典的實例(我認為的)
青蛙跳臺階問題:一只青蛙要跳上n層高的臺階,一次能跳一階,也可以跳2階,請問這只青蛙跳上n層高的臺階有多少種跳法?
問題解決:這個問題有好幾種解法,這里就講遞歸方法,這個問題需要逆向思維,如果從第一個臺階就開始算,就比較難想到終止條件,以及遞歸調(diào)用方式。我們可以讓青蛙下臺階,一次可以下一個,也可以下兩個。這時我們可以知道:
當n=1時,只有一種方法。
當n=2時,有兩種方法。
其n>2時,青蛙可以選擇跳兩層臺階,也可以選擇跳一層臺階。
以上我們可以得到,終止條件為臺階剩下1或2層時可以直接得到結(jié)果,即為邊界。當n>2時我們可以使用遞歸語句調(diào)用自身。這樣就可以寫出遞歸代碼:
public int climbStairs(int n){//終止條件if(n == 1)return 1;if(n == 2)return 2;//遞歸調(diào)用,此時青蛙可以選則跳一階也可以跳兩階,所以將兩種情況相加起來return climbStairs(n-1) + climbStairs(n-2); }總結(jié)
以上是生活随笔為你收集整理的什么是递归?递归的理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Document类型的总结
- 下一篇: 你的奋斗也许只是一个屁