簡體   English   中英

在Java中使用遞歸的影響

[英]Impact of using recursions in Java

我編寫了一個示例Java類,並在方法中將遞歸用於特定目的。 我在下面顯示了特定遞歸方法的代碼(請注意,我在這里僅提及了該方法的必需部分)。

  private String checkForDuplicateCVs(final Integer userId) throws SQLException {

       //
       // Codes to obtain the cvSerialId comes here...
       //

       final Integer cvCount = (Integer) getSqlMapClient().queryForObject("user.getCvCountBySerialId", cvSerialId);

        if (cvCount != 0) {
           checkForDuplicateCVs(userId);
        }

如果有人可以幫助我弄清楚在Java程序中使用遞歸的影響以及它是好習慣還是壞習慣,我將不勝感激。 如果這是一個不好的做法,那么負面影響是什么。

遞歸本身並不壞,實際上,它通常是設計算法的最佳方法。

就是說,在您的情況下,我會說這是糟糕的設計。 本質上,您有一個使用遞歸實現的while循環。

這可能有一些問題:

  • 可讀性和代碼維護。 這是一個循環,為什么要對其進行混淆?
  • 易發生堆棧溢出。 您的遞歸調用使用與父代相同的參數,因此如果數據庫不變,您很有可能會遇到無限循環。 對於while循環來說,這是完全可以的,但是在您的情況下,最終將達到堆棧限制並引發異常。 這將使您對遞歸的使用成為一個錯誤,我認為該錯誤會帶來安全隱患(拒絕服務)。
  • 這不適用於您的代碼,但通常來說,函數調用比簡單的循環要貴得多。 因此,如果您比較的執行時間while循環和遞歸實現,它的while循環,你會看到一個大的性能差距。 在某些情況下(即尾部遞歸)可以優化此方法,但並非總是如此。 (此影響在您的代碼中可以忽略不計,因為數據庫查詢要比函數調用開銷貴得多)

遞歸的唯一弊端是,如果函數將自己多次調用(您可以使用JVM參數修改堆棧大小),則可能會收到StackOverflowException。 請注意,遞歸始終可以用簡單的while循環替換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM