在编写递归函数时,有时会发生某些事情只会在递归算法的第一次传递时发生。如果这是真的,我有两个选择,
哪个选项更可取?如果是后者,我应该将这些功能命名为什么? (例如,如果我的洪水填充算法会选择FloodFill
和FloodFillRecursive
?)
先谢谢,等等。
答案 0 :(得分:4)
我可能会使用两个函数,我会说将被调用的函数应该命名为FloodFill
:用户不需要知道该函数是如何实现的,所以它不应该被命名为{ {1}}。
实际上,FloodFillRecursive
可以是内部函数的名称:包含实现的函数,由用户调用的函数调用on,因为它是第二个函数这是递归的。
理想情况下,用户不应该看到该功能:它应该隐藏在你的库中(可以隐藏它,或者使用一些命名约定来通知用户不应该直接调用它)
并且,这样,如果您更改实现,您将不会让您的用户调用可能不再递归的FloodFillRecursive
函数。
答案 1 :(得分:1)
这实际上取决于该功能是否可供第三方开发人员使用。如果是这样的话,最好使用两个函数方法来保持整洁,第二个函数(FloodFillRecursive)是私有/内部的。
如果不是那么可选参数方法就好了。
答案 2 :(得分:1)
在我能想到的每种情况下,选项2都更好。这取决于您使用的语言,但您可能会通过每次传递一个额外的参数来看到更多(完全可以避免的)开销。
对于命名约定,请使用外部函数的常规名称(例如FloodFill)。对于内部函数,我会说FloodFillRecursive或FloodFillInner是不错的选择。
答案 3 :(得分: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
在上面的例子中,递归函数需要很多参数(例如仍然是空闲的列,对角线和反对角线),但官方的公共函数只接受一个参数,递归是在内部处理的。