Java中的遞歸方法示例介紹
遞歸
方法定義本身調(diào)用方法本身的現(xiàn)象叫做遞歸
在這之前我們學(xué)的東西:例如StringBuffer.append().append().append()這個(gè)不叫遞歸。這個(gè)叫方法的連續(xù)調(diào)用Math.max(Math.max(a,b),c)也不是遞歸,那這些是什么呢?這些是方法的調(diào)用。
那什么是遞歸呢?
舉例:
從前有座山,山里有座廟,廟里有個(gè)老和尚,老和尚在給小和尚說故事,說的故事內(nèi)容是:。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
從前有座山,山里有座廟,廟里有個(gè)老和尚,老和尚在給小和尚說故事,說的故事內(nèi)容是:。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
從前有座山,山里有座廟,廟里有個(gè)老和尚,老和尚在給小和尚說故事,說的故事內(nèi)容是:。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
從前有座山,山里有座廟,廟里有個(gè)老和尚,老和尚在給小和尚說故事,說的故事內(nèi)容是:。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。廟不在了,遞歸結(jié)束。
舉例:
學(xué)習(xí)-高新就業(yè)-娶媳婦-生娃-學(xué)習(xí)-高薪就業(yè)-娶媳婦-生娃-學(xué)習(xí)-高新就業(yè)-娶媳婦-生娃-學(xué)習(xí)-高薪就業(yè)-娶媳婦-生娃-學(xué)習(xí)-高新就業(yè)-娶媳婦-生娃-學(xué)習(xí)-高薪就業(yè)-娶媳婦-生娃-學(xué)習(xí)-高新就業(yè)-娶媳婦-生娃-學(xué)習(xí)-高薪就業(yè)-娶媳婦-生娃-學(xué)習(xí)-高新就業(yè)-娶媳婦-生娃-學(xué)習(xí)-高薪就業(yè)-娶媳婦-生娃
娶不到媳婦,生不了娃,遞歸結(jié)束。
遞歸的注意事項(xiàng):
遞歸一定要有一個(gè)出口,結(jié)束條件,否則就是死循環(huán)遞歸的次數(shù)不能太多,否則就會(huì)發(fā)生內(nèi)存溢出構(gòu)造方法不能使用遞歸
案例一
參考代碼:
public class RecursionDemo1 { public static void main(String[] args) { show(10); } private static void show(int i) { //定義結(jié)束條件 if (i<0){ System.out.println("結(jié)束循環(huán)"); }else { System.out.print(i + "\t"); show(--i); } } }
輸出結(jié)果:
?10?? ?9?? ?8?? ?7?? ?6?? ?5?? ?4?? ?3?? ?2?? ?1?? ?0?? ?結(jié)束循環(huán)
遞歸求階乘
5的階乘:
? ? ? ? 遞歸求階乘:
? ? ? ? ? ? 5!= 5*4*3*2*1 = 120
? ? ? ? ? ? ? ?= 5*4!
? ? ? ? ? ? ? ?= 5*4*3!
? ? ? ? ? ? ? ?= 5*4*3*2!
? ? ? ? ? ? ? ?= 5*4*3*2*1!
不使用遞歸實(shí)現(xiàn)階乘
參考代碼:
/* 遞歸求階乘: 5!= 5*4*3*2*1 = 120 = 5*4! = 5*4*3! = 5*4*3*2! = 5*4*3*2*1! */ public class RecursionDemo2 { public static void main(String[] args) { //不使用遞歸的做法 int result = 1; for (int i = 2; i<=5; i++){ result = result * i; } System.out.println("5的階乘是:" + result); } }
?輸出結(jié)果:
5的階乘是:120
使用遞歸實(shí)現(xiàn)階乘
遞歸的實(shí)現(xiàn)思想:
1、結(jié)束條件:
if(i==1){return 1}??? 2、尋找規(guī)律:
if(i!=1){
return i * recursionFun(i-1);
}
參考代碼:
/* 遞歸求階乘: 5!= 5*4*3*2*1 = 120 = 5*4! = 5*4*3! = 5*4*3*2! = 5*4*3*2*1! */ public class RecursionDemo3 { public static void main(String[] args) { System.out.println(recursionFun(5)); } private static int recursionFun(int i) { if (i==1){ return 1; }else { //5 * recursionFun(4) //5 * 4 * recursionFun(3) //5 * 4 * 3 * recursionFun(2) //5 * 4 * 3 * 2 * recursionFun(1) //5 * 4 * 3 * 2 * 1 return i * recursionFun(i-1); } } }
輸出結(jié)果:
120
澳大利亞不死神兔(斐波那契數(shù)列)
有一對(duì)兔子,從出生第三個(gè)月開始,每個(gè)月都生一對(duì)兔子, 小兔子長(zhǎng)到三個(gè)月后每個(gè)月又生一對(duì)兔子,假設(shè)這些兔子都不會(huì)死, 問:20個(gè)月,又多少對(duì)兔子?
?找規(guī)律:
? ? ?月? ? ? ? ?兔子對(duì)數(shù)
? ? ?1? ? ? ? ? ? ?1
? ? ?2? ? ? ? ? ? ?1
? ? ?3? ? ? ? ? ? ?2
? ? ?4? ? ? ? ? ? ?3
? ? ?5? ? ? ? ? ? ?5
? ? ?6? ? ? ? ? ? ?8
? ? ?7? ? ? ? ? ? ?13
? ? ?...
由此可見,兔子的對(duì)數(shù)數(shù)量是:
1、1、2、3、5、8、13、21...
發(fā)現(xiàn)的規(guī)律是:
? ? ?1、從第三項(xiàng)開始,每一項(xiàng)都是前兩項(xiàng)之和
? ? ?2、說明每一項(xiàng)的前兩項(xiàng)的數(shù)據(jù)是已知的
?如何實(shí)現(xiàn)呢?
1、數(shù)組方式實(shí)現(xiàn)
2、基本變量實(shí)現(xiàn)
3、遞歸方式實(shí)現(xiàn)
使用數(shù)組實(shí)現(xiàn)
參考代碼:
public class RecursionDemo4 { public static void main(String[] args) { //使用數(shù)組實(shí)現(xiàn) int[] arr = new int[20]; arr[0] = 1; arr[1] = 1; for (int i =2 ;i < arr.length;i++){ arr[i] = arr[i-2] + arr[i -1]; } System.out.println("第20個(gè)月的兔子對(duì)數(shù)為:" + arr[19]); } }
?輸出結(jié)果:
第20個(gè)月的兔子對(duì)數(shù)為:6765
使用遞歸實(shí)現(xiàn)
參考代碼:
public class RecursionDemo5 { public static void main(String[] args) { System.out.println("第20個(gè)月的兔子對(duì)數(shù)為:" + ribbateFibonacci(20)); } private static int ribbateFibonacci(int month) { if (month == 1 || month ==2 ){ return 1; }else { return ribbateFibonacci(month-1) + ribbateFibonacci(month-2); } } }
輸出結(jié)果:
第20個(gè)月的兔子對(duì)數(shù)為:6765
總結(jié)
到此這篇關(guān)于Java中的遞歸方法示例介紹的文章就介紹到這了,更多相關(guān)Java遞歸方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù)的4種方式詳解
這篇文章主要介紹了SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù)的4種方式詳解,在Springboot中定時(shí)任務(wù)是一項(xiàng)經(jīng)常能用到的功能,實(shí)現(xiàn)定時(shí)任務(wù)的方式有很多,今天來介紹常用的幾種,需要的朋友可以參考下2023-11-11Java遞歸基礎(chǔ)與遞歸的宏觀語意實(shí)例分析
這篇文章主要介紹了Java遞歸基礎(chǔ)與遞歸的宏觀語意,結(jié)合實(shí)例形式分析了java遞歸的相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-03-03SpringBoot?實(shí)現(xiàn)動(dòng)態(tài)添加定時(shí)任務(wù)功能
這篇文章主要介紹了SpringBoot?動(dòng)態(tài)添加定時(shí)任務(wù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02Java線程間協(xié)作wait、notify和notifyAll詳解
這篇文章主要介紹了Java線程間協(xié)作wait、notify和notifyAll詳解,在 Java 中可以用 wait、notify 和 notifyAll 來實(shí)現(xiàn)線程間的通信,盡管關(guān)于wait和notify的概念很基礎(chǔ),它們也都是Object類的函數(shù),但用它們來寫代碼卻并不簡(jiǎn)單,,需要的朋友可以參考下2023-10-10SpringBoot模擬員工數(shù)據(jù)庫(kù)并實(shí)現(xiàn)增刪改查操作
這篇文章主要給大家介紹了關(guān)于SpringBoot模擬員工數(shù)據(jù)庫(kù)并實(shí)現(xiàn)增刪改查操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-09-09