黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 java遞歸筆試題參考

java遞歸筆試題參考

更新時間:2020-06-28 12:25:31 來源:動力節點 瀏覽2900次

java遞歸筆試題是常見的java筆試題,動力節點java培訓機構的小編就為大家整理一些,希望對大家能夠有所幫助。

java遞歸筆試題

1、請寫一段代碼來計算給定文本內字符“A”的個數。分別用迭代和遞歸兩種方式。

假設給定文本為”AAA rating”。迭代方式就很直觀,如下:

public?class?Iteration?{
????public?int?countA(String?input)?{
????????if?(input?==?null?||?input.length(?)?==?0)?{
????????????return?0;
????????}
????????int?count?=?0;
????????for?(int?i?=?0;?i?<?input.length(?);?i++)?{
????????????if(input.substring(i,?i+1).equals("A")){
????????????????count++;
????????????}
????????}
????????return?count;
????}
????public?static?void?main(String[?]?args)?{
??????????System.out.println(new?Iteration(?).countA("AAA?rating"));?????//?Ans.3
????}
}

接下來,遞歸方式的代碼如下:

public?class?RecursiveCall?{
????public?int?countA(String?input)?{
????????//?exit?condition?–?recursive?calls?must?have?an?exit?condition
????????if?(input?==?null?||?input.length(?)?==?0)?{
????????????return?0;
????????}
?
????????int?count?=?0;
?
????????//check?first?character?of?the?input
????????if?(input.substring(0,?1).equals("A"))?{
????????????count?=?1;
????????}
?
????????//recursive?call?to?evaluate?rest?of?the?input
????????//(i.e.??2nd?character?onwards)
????????return?count?+?countA(input.substring(1));
????}
?
????public?static?void?main(String[?]?args)?{
????????System.out.println(new?RecursiveCall(?).countA("AAA?rating"));??//?Ans.?3
????}
}

遞歸比較難以理解,我們用下面的圖來進行說明。

1.png

2、理解遞歸需要了解哪些概念?

java面試題可重入方法(re-entrant method)是可以安全進入的方法,即使同一個方法正在被執行,深入到同一個線程的調用棧里面也不會影響此次執行的安全性。一個非可重入方法則不是可以安全進入的。例如,加入寫文件或者向文件中寫入日志的方法不是可重入方法時,有可能會毀壞那個文件。

如果一個方法調用了其自身的話,我們稱之為遞歸調用。假定棧空間足夠的話,盡管遞歸調用比較難以調試,在Java語言中實現遞歸調用也是完全可行的。遞歸方法是眾多算法中替代循環的一個不錯選擇。所有的遞歸方法都是可重入的,但是不是所有可重入的方法都是遞歸的。

棧遵守LIFO(Last In First Out)規則,因此遞歸調用方法能夠記住“調用者”并且知道此輪執行結束之返回至當初的被調用位置。遞歸利用系統棧來存儲方法調用的返回地址。 Java是一種基于棧設計的編程語言。

3、什么情況下應該采用遞歸?

上面的例子中其實不必采用遞歸,循環的方式可以達到目的,但是在某些情況下采用遞歸方式則代碼會更加簡短易讀。遞歸方法在循環樹結構以及避免丑陋的嵌套循環的情況下是非常好用的。

4、什么是尾遞歸,為什么需要尾遞歸?上面的代碼用尾遞歸方式如何重寫?

常規遞歸方法(亦稱,頭遞歸)在上面演示了,這種方式會增加調用棧的大小。每次遞歸,其入口需要被記錄在棧中。方法返回之前需要給countA(input.substring(1)的結果加一個count。假定count大于1,那么返回結果就是count + countA(input.substring(1)),當然事先要算出來countA(input.substring(1))才行。同時,這也意味著直到countA(input.substring(1)計算出來才能得到最終的結果。因此,最后需要做的事其實是加法運算,而非遞歸本身。

尾遞歸的好處是什么?

java面試題在尾遞歸中,最后要做的是遞歸,加法運算在之前就已經完成了。一輪遞歸調用完畢后就沒有其他事情了(除了加法運算),因此調用時生成的信息也就沒什么用了。這些無用信息可以丟棄,然后用一組新的參數來調用一次遞歸方法來產生一個新的結果。這也就是說,棧調用減少帶來了內存消耗減少并且程序的性能更好。

尾遞歸重寫的代碼如下:

public?class?TailRecursiveCall?{
?public?int?countA(String?input)?{
?
??//?exit?condition?–?recursive?calls?must?have?an?exit?condition
??if?(input?==?null?||?input.length()?==?0)?{
???return?0;
??}
?
??return?countA(input,?0)?;
?}
?
?public?int?countA(String?input,?int?count)?{
??if?(input.length()?==?0)?{
???return?count;
??}
?
??//?check?first?character?of?the?input
??if?(input.substring(0,?1).equals("A"))?{
???count?=?count?+?1;
??}
?
??//?recursive?call?is?the?last?call?as?the?count?is?cumulative
??return?countA(input.substring(1),?count);
?}
?
?public?static?void?main(String[]?args)?{
??System.out.println(new?TailRecursiveCall().countA("AAA?rating"));
?}
}

以上就是動力節點java培訓機構的小編針對“java遞歸筆試題參考”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 免费观看黄色a一级录像 | 精品在线免费播放 | 成人免费激情视频 | 天天插天天射天天操 | 国产亚洲欧美在线视频 | 天天躁夜夜躁狠狠躁 | 91妖精视频 | 亚洲成综合人影院在院播放 | a级黄色影片 | 韩国2023理伦片免费观看 | 婷婷人人爽人人爽人人片 | 日本一区二区三区视频在线 | 日本高清一本二本三本如色坊 | 免费看黄无遮挡滚床单视频 | 在线亚洲精品国产成人二区 | 亚洲日本中文字幕天天更新 | 你懂的 在线观看 | 九九99九九精彩网站 | 一级a俄罗斯毛片免费 | 一级片生活片 | 美女黄色片网站 | 免费看特黄特黄欧美大片 | 天天看片日日夜夜 | 日本国产欧美 | 午夜男人剧场 | 欧美视频一区二区三区在线观看 | 三级黄色在线视频 | 男女性激烈动态图无遮挡 | 亚洲国产激情一区二区三区 | 深夜国产福利 | 永久免费精品视频 | 91小鲜肉| 日本在线亚洲 | 国产三级a三级三级野外 | 人人艹人人艹 | 成人av播放| 日本r级在线观看播放 | 久久久久国产视频 | 久久伊人网站 | 国产精品亚洲二区 | 亚洲综合日韩在线亚洲欧美专区 |