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ì)兔子, 小兔子長到三個(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)文章
java中File與MultipartFile互轉(zhuǎn)代碼示例
在Java開發(fā)中,當(dāng)需要將本地File對(duì)象轉(zhuǎn)換為MultipartFile對(duì)象以處理文件上傳時(shí),可以通過實(shí)現(xiàn)MultipartFile接口或使用CommonsMultipartFile類來實(shí)現(xiàn),本文提供了詳細(xì)的轉(zhuǎn)換方法和代碼示例,需要的朋友可以參考下2024-10-10
Java使用TCP協(xié)議發(fā)送和接收數(shù)據(jù)方式
這篇文章詳細(xì)介紹了Java中使用TCP進(jìn)行數(shù)據(jù)傳輸?shù)牟襟E,包括創(chuàng)建Socket對(duì)象、獲取輸入輸出流、讀寫數(shù)據(jù)以及釋放資源,通過兩個(gè)示例代碼TCPTest01.java和TCPTest02.java,展示了如何在客戶端和服務(wù)器端進(jìn)行數(shù)據(jù)交換2024-12-12
springMVC 用戶登錄權(quán)限驗(yàn)證實(shí)現(xiàn)過程解析
這篇文章主要介紹了springMVC 用戶登錄權(quán)限驗(yàn)證實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
一文深入分析java.lang.ClassNotFoundException異常
這篇文章主要給大家介紹了關(guān)于java.lang.ClassNotFoundException異常的相關(guān)資料,java.lang.ClassNotFoundException是Java編程時(shí)經(jīng)常會(huì)遇到的一個(gè)異常,它表示JVM在嘗試加載某個(gè)類時(shí)未能找到該類,需要的朋友可以參考下2023-10-10
詳解Java的TCP/IP編程學(xué)習(xí)--基于定界符的成幀
這篇文章主要介紹了Java的TCP/IP編程學(xué)習(xí)--基于定界符的成幀,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Java深入了解數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列的詳解
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列,在Java的時(shí)候,對(duì)于棧與隊(duì)列的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時(shí)候能夠有扎實(shí)的基礎(chǔ)能力。本文小編就來詳細(xì)說說Java中的棧與隊(duì)列,需要的朋友可以參考一下2022-01-01
關(guān)于網(wǎng)頁報(bào)錯(cuò)404原因以及解決方法
404錯(cuò)誤是網(wǎng)站常見的錯(cuò)誤之一,出現(xiàn)的原因很多,解決方法也有很多種,這篇文章主要給大家介紹了關(guān)于網(wǎng)頁報(bào)錯(cuò)404原因以及解決方法的相關(guān)資料,需要的朋友可以參考下2024-01-01
Intellij IDEA中如何查看maven項(xiàng)目中所有jar包的依賴關(guān)系圖
這篇文章主要介紹了Intellij IDEA中如何查看maven項(xiàng)目中所有jar包的依賴關(guān)系圖,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05

