2012-02-11 56 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