這篇文章主要講解了“Java遞歸優(yōu)化的方法是什么”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java遞歸優(yōu)化的方法是什么”吧!
1.go to語法
今天偶然看到ThreadPoolExecutor的addworker方法用到了go to,他到底是個優(yōu)雅高級語法,還是個混淆語法。
public static void main(String[] args) { for (int i = 0; i <2; i++) { for (int j = 0; j < 5; j++) { System.out.println(j); if(j==3){ break; } } } System.out.println("=================="); retry: for (int i = 0; i <2; i++) { for (int j = 0; j < 5; j++) { System.out.println(j); if(j==3){ break retry; } } } }
普通的break跳出了當前for循環(huán),但沒有結(jié)束外層循環(huán)
retry 標識此處循環(huán)跳出,標識位在外層循環(huán)外面,跳出外循環(huán)。
2.遞歸優(yōu)化
遞歸算法空間復雜度:遞歸深度n*每次遞歸所要的輔助空間,如果每次遞歸所需要的輔助空間為常數(shù),則遞歸空間復雜度o(n)。
優(yōu)化前
public Long filterOrg(Long orgId) { CountVo vo= gMapper.queryOrId(orgId); if(vo==null){ return orgId; }else if(1==vo.getPid()){ return orgId; }else{ return filterOrg(vo.getPid()); }
業(yè)務邏輯不考慮pid為null情況
參數(shù)傳入之前寫在lambada表達式中沒有判空
這個if看著賊煩
N級節(jié)點遞歸層次太深
優(yōu)化
public Long filterOrg(Long orgId) { if (orgId == 1) return orgId; Long serachId = orgId; for (; ;) { CountVo vo = this.queryOrgId(serachId); if(vo==null||vo.getPid()==1)return orgId; serachId=vo.getPid(); } }
然后kk不知廉恥的寫上了一段注釋,深藏功與名
/** * 功能描述: 舍棄遞歸,復雜度降低,避免棧溢出 * @Param: [orgId] * @Return: java.lang.Long * @Author: kk */
看著這個多層if就想起被千行foreach+if支配的恐懼,必須干掉他,寫到這竟然笑出了聲,可能這就是菜雞成長的喜悅吧。
函數(shù)調(diào)用自身,稱為遞歸。如果尾調(diào)用自身,就稱為尾遞歸。遞歸非常耗費內(nèi)存,因為需要同時保存成千上百個調(diào)用幀,很容易發(fā)生“棧溢出”錯誤(stack overflow)。但對于尾遞歸來說,由于只存在一個調(diào)用幀,所以永遠不會發(fā)生“棧溢出”錯誤。這個優(yōu)化厲害了
function factorial(n, total) { if (n === 1) return total; return factorial(n - 1, n * total);} factorial(5, 1) // 120
尾遞歸優(yōu)化
function Fibonacci2 (n , ac1 = 1 , ac2 = 1) { if( n <= 1 ) {return ac2}; return Fibonacci2 (n - 1, ac2, ac1 + ac2);} Fibonacci2(100) // 573147844013817200000Fibonacci2(1000) // 7.0330367711422765e+208Fibonacci2(10000) // Infinityhttps://blog.csdn.net/qq_37818095/article/details/81944809
雖然這是js的
用隊列優(yōu)化遞歸
public void getFile(File file){ if(file.isDirectory()){//如果是目錄 File[] files = file.listFiles(); for(int i=0;i<files.length;i++) getFile(files[i]);//遞歸 } else if(file.isFile()){ //如果是文件,就輸出。 System.out.println(file.getName()); } }
使用隊列優(yōu)化。
//創(chuàng)建一個隊列Queen<File> queue = new LinkedList<File>();queue.offer(file);while(!queue.isEmpty()){//如果隊列不為空File file = queue.poll();if(file.isDirectory()){//從隊列中獲取一個FileFile[] files = file.listFiles();//是目錄,將目錄下所有文件遍歷出來,存儲到隊列中for(int i =0;i<files.length;i++)queue.offer(files[i]); }else{//是文件,進行輸出。System.out.println(file.getName()); }
}
感謝各位的閱讀,以上就是“Java遞歸優(yōu)化的方法是什么”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Java遞歸優(yōu)化的方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。