Java 方法遞歸的思路詳解
前言
今天給老鐵們回顧一下遞歸的思路以及方法,也是給自己的一個(gè)歸納總結(jié)。
一、什么是方法遞歸
所謂的方法遞歸,就是在一個(gè)方法(函數(shù))執(zhí)行的內(nèi)部,自己調(diào)用了自己的過程,稱之為 “遞歸” 。
遞歸分為兩個(gè)子過程:
- 遞過程:函數(shù)不斷地調(diào)用自身,直到走到函數(shù)的終止條件,第一階段結(jié)束。
- 歸過程:函數(shù)不斷地返回的過程。
例如, 我們求 N! 起始條件: N = 1 的時(shí)候, N! 為 1. 這個(gè)起始條件相當(dāng)于遞歸的結(jié)束條件. 遞歸公式: 求 N! ,
直接不好求, 可以把問題轉(zhuǎn)換成 N! => N * (N-1)!
示例:遞歸求N的階乘
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 調(diào)用函數(shù)自身
}
// 執(zhí)行結(jié)果
ret = 120
二、什么場(chǎng)景下能用遞歸
a.一個(gè)大問題(這個(gè)方法的功能)可以拆分成若干個(gè)子問題的解.
b.拆分后的子問題和原問題除了數(shù)據(jù)規(guī)模不同,解決思路完全相同.
c.必須存在遞歸的終止條件(不會(huì)無限拆分下去,一定能走到底~).
(看不懂先看下面(●ˇ∀ˇ●))
三、如何寫出遞歸代碼-重點(diǎn)
- 先考慮這個(gè)函數(shù)的終止條件
比如上面的栗子:求N的階乘。
拿求5的階乘做例子:

我們把大問題(5的階乘)一直拆分到1的時(shí)候,問題無法繼續(xù)拆分下去了,這個(gè)子問題就是這個(gè)遞歸的最終條件。
所以我們寫代碼的時(shí)候,可以先把最終條件寫上:
if (n == 1) {
return 1;
}
- 假設(shè)這個(gè)函數(shù)已經(jīng)寫好了(注意這個(gè)方法的語義)
在寫遞歸函數(shù)的時(shí)候,千萬不要糾結(jié)這個(gè)函數(shù)內(nèi)部是如何實(shí)現(xiàn)的,而是要注意這個(gè)函數(shù)有什么功能(假設(shè)這個(gè)函數(shù)別人已經(jīng)寫好了),我們把它當(dāng)作一個(gè)黑盒子,你只是去調(diào)用這個(gè)函數(shù)罷了。
public static int factor(int n)
比如這個(gè)函數(shù)只能傳入一個(gè)n,目前我們只能知道這個(gè)n是多少,而n的階乘等于n* [(n-1)!],但是我們并不知道n-1的階乘是多少,那么就調(diào)用這個(gè)別人寫好的“黑盒子”。這個(gè)黑盒子的功能可以實(shí)現(xiàn)某個(gè)數(shù)的階乘。
n * factor(n - 1) // n*黑盒子
說白了就是,把這個(gè)factor函數(shù)當(dāng)作別人已經(jīng)寫好了,你只需要關(guān)注如何去調(diào)用這個(gè)方法去輔助你解決問題就可以了!
總結(jié)
寫出遞歸其實(shí)=終止條件+利用黑盒子去解決剩下的問題,注意傳入的參數(shù)就可以很快把遞歸代碼寫出來(●ˇ∀ˇ●)。
到此這篇關(guān)于Java 方法遞歸的思路詳解的文章就介紹到這了,更多相關(guān)Java 遞歸內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java語言實(shí)現(xiàn)簡(jiǎn)單FTP軟件 FTP軟件效果圖預(yù)覽之下載功能(2)
這篇文章主要為大家詳細(xì)介紹了Java語言實(shí)現(xiàn)簡(jiǎn)單FTP軟件,F(xiàn)TP軟件效果圖預(yù)覽之下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
SpringBoot集成minio實(shí)現(xiàn)文件上傳和刪除功能
這篇文章主要介紹了SpringBoot集成minio實(shí)現(xiàn)文件上傳和刪除功能,詳細(xì)介紹每個(gè)功能的實(shí)現(xiàn)步驟和代碼示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11
解決BufferedReader.readLine()遇見的坑
這篇文章主要介紹了解決BufferedReader.readLine()遇見的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot中的響應(yīng)式web應(yīng)用詳解
這篇文章主要介紹了SpringBoot中的響應(yīng)式web應(yīng)用詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
idea中使用SonarLint進(jìn)行代碼規(guī)范檢測(cè)及使用方法
這篇文章主要介紹了idea中使用SonarLint進(jìn)行代碼規(guī)范檢測(cè),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
關(guān)于Spring AOP使用時(shí)的一些問題匯總
這篇文章主要給大家匯總介紹了關(guān)于Spring AOP使用時(shí)的一些問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Spring Boot之內(nèi)嵌tomcat版本升級(jí)操作示例
這篇文章主要為大家介紹了Spring Boot之內(nèi)嵌tomcat版本升級(jí)操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
SpringSecurity+Redis+Jwt實(shí)現(xiàn)用戶認(rèn)證授權(quán)
SpringSecurity是一個(gè)強(qiáng)大且靈活的身份驗(yàn)證和訪問控制框架,本文主要介紹了SpringSecurity+Redis+Jwt實(shí)現(xiàn)用戶認(rèn)證授權(quán),具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07

