遞迴 儘量減少不必要的遞迴消耗方式

2021-07-15 05:47:09 字數 1540 閱讀 2521

能用迭代的盡量不用遞迴,在使用遞迴的時候寫發也很重要,要儘量減少不必要的再次遞迴呼叫:

e.g.:

這是乙個遞迴刪除資料夾的例子:

寫法1:

private static boolean deletedir (file dir) 

}dir.delete ();//是資料夾通過上面的遞迴就已經刪空了,最後不管是空資料夾還是檔案都刪除

return true;

}

寫法2:

private static boolean deletedir (file dir)  else }}

dir.delete ();//是資料夾通過上面的遞迴就已經刪空了,最後不管是空資料夾還是檔案都刪除

return true;

}

寫法1和寫法2 都能實現,但是寫法1在遍歷files的時候把每乙個file都進行了一次遞迴呼叫,總的呼叫次數為檔案數n+資料夾數m

而寫法2對每乙個file進行一次判斷,檔案就直接刪除,不再進行遞迴呼叫,只對資料夾進行呼叫,總的呼叫次數為資料夾數m

相對與每次遞迴呼叫的消耗來說,進行一次判斷而取消一次遞迴,應該是很划算的.以後寫遞迴的時候也要注意

再比如下面的copy的栗子:

寫法1:

private static boolean copydir(file soc,file dsc) throws ioexception 

fis.close ();

fos.close ();

} else

file files = soc.listfiles ();

for (file file : files)

}return true;

}

寫法2:

private static boolean copydir(file soc,file dsc) throws ioexception 

file files = soc.listfiles ();

for (file file : files)

fis.close ();

fos.close ();

} else

}return true;

}

同樣也是都能實現,但是寫法1在:

for (file file : files)

這裡把子目錄下所有的目錄包括檔案都進行遞迴呼叫,檔案也遞迴一次在該次遞迴中才判斷是否是檔案,而進行處理,這是很沒有必要而且浪費的,應該和寫法2一樣在這裡進行判斷,對不需要遞迴解決的問題,當場解決,減少遞迴的呼叫次數和記憶體消耗,

綜合今天的錯誤來看,貌似只要在呼叫遞迴之前,進行一次判定,把不需要進行遞迴的問題當場解決,就可以減少不必要的遞迴呼叫,

也就是說要把遞迴語句放在if-else塊中

減少消耗,增加效率.(自我總結,有待驗證!!!)

dfs的姿勢 儘量減少不必要的搜尋

好長時間不做搜尋了 雖然做了乙個簡單的果斷tle 和別人 一比就看出高低了 include include include include include include include include include include include include include include ...

React 中減少不必要的巢狀

react 中有乙個fragment,可以通過它無需向dom新增額外包含節點。render 有時候可能會需要用到鍵值key 就比如要建立乙個列表 function list props dt dd react.fragment dl key是可以傳遞給fragment的屬性,此外,還可以使用一種新的...

Eclipse用法和技巧十八 減少不必要的輸入

寫 的時候,很多人都有乙個原則,盡量上輸入。依靠ide自動生成的 一般可讀性,排版什麼的都還是不錯的,最主要的一般不會有什麼低階錯誤。今天介紹幾個在eclipse環境中,常用的依靠eclipse完成的操作。第乙個,在實現方法的時候,經常會用到區域性變數,這些區域性變數的初始化值來自於某些物件的某些方...