大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

Java教程
Java標(biāo)識(shí)符與關(guān)鍵字
Java變量
Java數(shù)據(jù)類型
Java運(yùn)算符
Java控制語句
Java方法

Java遞歸方法

什么是方法遞歸?我們先來看一段代碼:

public class RecursionTest01 {
	public static void main(String[] args) {
		m();
	}
	public static void m(){
		System.out.println("m begin");
		m();
		System.out.println("m over");
	}
}

以上代碼的執(zhí)行結(jié)果如下圖所示:

遞歸執(zhí)行結(jié)果

圖7-17:遞歸執(zhí)行結(jié)果

我們可以看到以上代碼的執(zhí)行過程中,一直輸出“m begin”,“m over”一次也沒有輸出,直到最終發(fā)生了錯(cuò)誤:java.lang.StackOverflowError,這個(gè)錯(cuò)誤是棧內(nèi)存溢出錯(cuò)誤,錯(cuò)誤發(fā)生后,JVM退出了,程序結(jié)束了。

實(shí)際上以上代碼在m()方法執(zhí)行過程中又調(diào)用了m()方法,方法自身調(diào)用自身,這就是方法遞歸調(diào)用。以上程序?qū)嶋H上等同于以下的偽代碼(說明問題,但是無法執(zhí)行的代碼):

遞歸執(zhí)行原理的偽代碼

圖7-18:說明遞歸執(zhí)行原理的偽代碼

通過偽代碼我們可以看出,m()方法一直在被調(diào)用(方法中的代碼必須遵循自上而下的順序依次逐行執(zhí)行,不能跳行執(zhí)行),對于棧內(nèi)存來說一直在進(jìn)行壓棧操作,m()方法從未結(jié)束過,所以沒有彈棧操作,即使棧內(nèi)存足夠大(也是有限的內(nèi)存),總有一天棧內(nèi)存會(huì)不夠用的,這個(gè)時(shí)候就會(huì)出現(xiàn)棧內(nèi)存溢出錯(cuò)誤。通過以上研究得出遞歸必須要有合法的結(jié)束條件,沒有結(jié)束條件就一定會(huì)發(fā)生StackOverflowError。我們再來看看有結(jié)束條件的遞歸,例如以下代碼:

Java編程開發(fā)

圖7-19:遞歸的過程中滿足了某個(gè)條件,遞歸結(jié)束了

綜上所述,遞歸其實(shí)就是方法在執(zhí)行的過程中調(diào)用了另一個(gè)方法,而另一個(gè)方法則是自己本身。在代碼角度來看就是在a()方法中調(diào)用a()方法,使用遞歸須謹(jǐn)慎,因?yàn)檫f歸在使用的時(shí)候必須有結(jié)束條件,沒有結(jié)束條件就會(huì)導(dǎo)致無終止的壓棧,棧內(nèi)存最終必然會(huì)溢出,程序因錯(cuò)誤的發(fā)生而終止。

大家再來思考一個(gè)問題,一個(gè)遞歸程序有合法有效的結(jié)束條件就一定不會(huì)發(fā)生棧內(nèi)存溢出錯(cuò)誤嗎?在實(shí)際開發(fā)中遇到這個(gè)錯(cuò)誤應(yīng)該怎么辦?

一個(gè)遞歸程序有的時(shí)候存在合法有效的終止條件,但由于遞歸的太深,在還沒有等到條件成立的時(shí)候,棧內(nèi)存已經(jīng)發(fā)生了溢出,這種情況也是存在的,所以實(shí)際開發(fā)中我們盡可能使用循環(huán)來代替遞歸算法,原則是:能不用遞歸盡量不用,能用循環(huán)代替的盡可能使用循環(huán)。當(dāng)然,如果在開發(fā)中遇到了由于使用遞歸導(dǎo)致棧內(nèi)存溢出錯(cuò)誤的發(fā)生,首先,我們要檢查遞歸的終止條件是否合法,如果是合法的還是發(fā)生棧內(nèi)存溢出錯(cuò)誤,那么我們可以嘗試調(diào)整堆棧空間的大小。怎么調(diào)整堆棧大小呢,大家可以研究一下下圖中的一些參數(shù),這里就不再講解內(nèi)存大小的調(diào)整了,這不是初級程序員應(yīng)該掌握的。

java虛擬機(jī)內(nèi)存設(shè)置參數(shù)

圖7-20:java虛擬機(jī)內(nèi)存設(shè)置參數(shù)

接下來我們來研究一下在不使用遞歸的前提下,完成1~N的求和,這個(gè)應(yīng)該很簡單,請看下面代碼:

public class RecursionTest02 {
	public static void main(String[] args) {
		int n = 5;
		int result = accumulate(n);
		System.out.println("1到" + n + "的和是:" + result);
	}
	public static int accumulate(int n){
		int result = 0;
		for(int i = 1;i <= n; i++){
			result += i;
		}
		return result;
	}
}

運(yùn)行結(jié)果如下圖所示:

圖7-21:不使用遞歸計(jì)算1~N的和

那么,使用遞歸應(yīng)該怎么寫呢?請看以下代碼:

public class RecursionTest03 {
	public static void main(String[] args) {
		int n = 5;
		int result = accumulate(n);
		System.out.println("1到" + n + "的和是:" + result);
	}
	public static int accumulate(int n){
		if(n == 1){
			return 1;
		}
		return n + accumulate(n - 1);
	}
}

運(yùn)行結(jié)果如下圖所示:

圖7-22:使用遞歸計(jì)算1~N的和

我們來使用偽代碼對以上代碼的執(zhí)行過程進(jìn)行分析,請看以下偽代碼:

public static int accumulate(int n){ //假設(shè)n是5
	if(n == 1){
		return 1;
	}
	return n + accumulate(n - 1);
	//return 5 + accumulate(4);   		return 5 + 4 + 3 + 2 + 1;
}
public static int accumulate(int n){
	if(n == 1){
		return 1;
	}
	return n + accumulate(n - 1);
	//return 4 + accumulate(3);				return 4 + 3 + 2 + 1;
}
public static int accumulate(int n){
	if(n == 1){
		return 1;
	}
	return n + accumulate(n - 1);
	//return 3 + accumulate(2);				return 3 + 2 + 1;
}
public static int accumulate(int n){
	if(n == 1){
		return 1;
	}
	return n + accumulate(n - 1);
	//return 2 + accumulate(1);				return 2 + 1;
}
public static int accumulate(int n){
	if(n == 1){
		return 1; //這行代碼執(zhí)行了			return 1;
	}
}

以上程序的內(nèi)存變化是這樣的,請看下圖:

Java編程開發(fā)

圖7-23:1~N遞歸求和內(nèi)存圖

為了加強(qiáng)大家對遞歸算法的理解,我們再來看一張圖:

Java系統(tǒng)開發(fā)

圖7-24:另一種形式的遞歸內(nèi)存圖

其實(shí)大家把上圖逆時(shí)針旋轉(zhuǎn)90度,你會(huì)看到一個(gè)棧數(shù)據(jù)結(jié)構(gòu)對嗎?

主站蜘蛛池模板: 久久久久久久尹人综合网亚洲 | 精品一区二区三区在线成人 | 极品女神西比尔久久精品 | 午夜视频在线网站 | 欧美一及 | 国内精品久久久久影院老司 | 乱子伦有声小说mp3 仑乱高清在线一级播放 | 国产精品久久久久久五月尺 | 欧美夜夜操 | 久久久青草青青国产亚洲免观 | 99资源在线 | 天天天操天天天干 | 久久精品国产国产精品四凭 | 中文字幕在线观看不卡 | 四虎永久在线精品免费观看地址 | 黄色毛片免费 | 欧美日韩综合 | 亚洲精品乱码久久久久久中文字幕 | 久久这里只有精品国产 | 91手机在线视频观看 | 精品一区二区三区四区乱码90 | 天天摸日日舔 | 91手机在线视频 | 久久精品日日躁精品 | 特黄十八岁大片 | 老司机永久免费网站在线观看 | 亚洲人成绝费网站色ww | 伊人久久成人成综合网222 | 宅男影院在线 | 手机看片日韩日韩国产在线看 | 久久精品免费i 国产 | 夜夜操女人 | 亚洲国产精品视频在线观看 | 一二三区无线码2021 | 日本午夜www高清视频 | 成人免费观看视频久爱网 | 9久9久女女热精品视频免费观看 | 在线欧美一级毛片免费观看 | 四虎免费紧急入口观看 | 欧美日韩性视频在线 | 亚洲 欧美 精品 |