在编写递归函数时,有时会发生某些情况只发生在递归算法的第一遍上。如果这是真的,我有两个选择,递归函数 - 两个函数或最后一个可选参数
- 有一个名为“第一跑”的可选参数,默认情况下设置为true,但当递归调用,参数是假
- 有两个功能
哪个选项更可取?如果是后者,我应该如何命名这些功能? (例如,如果它的洪水填充算法,我会选择FloodFill
和FloodFillRecursive
?)
在此先感谢,
在编写递归函数时,有时会发生某些情况只发生在递归算法的第一遍上。如果这是真的,我有两个选择,递归函数 - 两个函数或最后一个可选参数
哪个选项更可取?如果是后者,我应该如何命名这些功能? (例如,如果它的洪水填充算法,我会选择FloodFill
和FloodFillRecursive
?)
在此先感谢,
我可能会使用两个函数,我会说这个函数将被命名为FloodFill
:用户不需要知道该函数是如何实现的,所以它不应该被命名为FloodFillRecursive
。
其实,FloodFillRecursive
可能是内函数的名称:包含该实现的,在上是由一个用户名为叫 - 因为这是第二个功能是递归。
理想情况下,该功能不应该从用户可见:它应该是隐藏在您的图书馆(隐藏,或使用一些通知用户,他们不应该直接调用它的命名约定)。
而且,这样,如果更改实现,则不会让用户调用可能无法递归的FloodFillRecursive
函数。
这真的取决于函数是否可以被第三方开发人员使用。如果是这样的话,可能最好使用两个函数方法来保持整洁,第二个函数(FloodFillRecursive)是私有的/内部的。
如果不是那么可选参数的方法是好的。
在我能想到的每种情况下,选项2都更好。这取决于你正在使用的语言,但是你可能会每次传递一个额外的参数来看到更多的(完全可避免的)开销。
对于命名约定,使用外部函数的正常名称(例如FloodFill)。对于内部函数,我会说FloodFillRecursive或FloodFillInner是不错的选择。
啊我从来没有想过开销,谢谢! – Ell 2012-02-11 20:17:54
如果语言允许,那么在我看来,最好的方法是使用官方的“干净”界面,并使用本地函数(外部不可见)进行递归。
例如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
在上面的例子中递归函数需要许多参数(例如仍然空闲的列,对角线和反对角线),但官方的公共职能只接受一个参数和递归内部处理。
也没有想到这个,也谢谢你! – Ell 2012-02-11 20:25:52
这正是我在想的 - 我只是检查我正在使用最佳实践。我会留下这个问题,看看我是否得到任何其他答复。感谢您的输入! – Ell 2012-02-11 20:12:12
不客气:-) – 2012-02-11 20:12:32