2012-02-11 54 views
2

在編寫遞歸函數時,有時會發生某些情況只發生在遞歸算法的第一遍上。如果這是真的,我有兩個選擇,遞歸函數 - 兩個函數或最後一個可選參數

  1. 有一個名爲「第一跑」的可選參數,默認情況下設置爲true,但當遞歸調用,參數是假
  2. 有兩個功能

哪個選項更可取?如果是後者,我應該如何命名這些功能? (例如,如果它的洪水填充算法,我會選擇FloodFillFloodFillRecursive?)

在此先感謝,

回答

4

我可能會使用兩個函數,我會說這個函數將被命名爲FloodFill:用戶不需要知道該函數是如何實現的,所以它不應該被命名爲FloodFillRecursive


其實,FloodFillRecursive可能是函數的名稱:包含該實現的,在上是由一個用戶名爲叫 - 因爲這是第二個功能是遞歸。
理想情況下,該功能不應該從用戶可見:它應該是隱藏在您的圖書館(隱藏,或使用一些通知用戶,他們不應該直接調用它的命名約定)

而且,這樣,如果更改實現,則不會讓用戶調用可能無法遞歸的FloodFillRecursive函數。

+0

這正是我在想的 - 我只是檢查我正在使用最佳實踐。我會留下這個問題,看看我是否得到任何其他答覆。感謝您的輸入! – Ell 2012-02-11 20:12:12

+0

不客氣:-) – 2012-02-11 20:12:32

1

這真的取決於函數是否可以被第三方開發人員使用。如果是這樣的話,可能最好使用兩個函數方法來保持整潔,第二個函數(FloodFillRecursive)是私有的/內部的。

如果不是那麼可選參數的方法是好的。

1

在我能想到的每種情況下,選項2都更好。這取決於你正在使用的語言,但是你可能會每次傳遞一個額外的參數來看到更多的(完全可避免的)開銷。

對於命名約定,使用外部函數的正常名稱(例如FloodFill)。對於內部函數,我會說FloodFillRecursive或FloodFillInner是不錯的選擇。

+0

啊我從來沒有想過開銷,謝謝! – Ell 2012-02-11 20:17:54

1

如果語言允許,那麼在我看來,最好的方法是使用官方的「乾淨」界面,並使用本地函數(外部不可見)進行遞歸。

例如Common Lisp中

(defun n-queens (n) 
    (let ((result (list))) 
     (labels ((place-queen (row free-cols free-diagonals free-counter-diagonals) 
        ...)) 
     (place-queen 0 ...) 
     result))) 

或Python

def n_queens(n): 
    result = [] 
    def place_queen(row, free_cols, free_diags, free_counter_diags): 
     ... 
    place_queen(0, ...) 
    return result 

在上面的例子中遞歸函數需要許多參數(例如仍然空閒的列,對角線和反對角線),但官方的公共職能只接受一個參數和遞歸內部處理。

+0

也沒有想到這個,也謝謝你! – Ell 2012-02-11 20:25:52