递归函数 - 两个函数或最后一个可选参数

时间:2012-02-11 20:07:11

标签: language-agnostic recursion naming-conventions

在编写递归函数时,有时会发生某些事情只会在递归算法的第一次传递时发生。如果这是真的,我有两个选择,

  1. 有一个名为“first run”的可选参数,默认设置为true,但递归调用时,参数为false
  2. 有两个功能
  3. 哪个选项更可取?如果是后者,我应该将这些功能命名为什么? (例如,如果我的洪水填充算法会选择FloodFillFloodFillRecursive?)

    先谢谢,等等。

4 个答案:

答案 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

在上面的例子中,递归函数需要很多参数(例如仍然是空闲的列,对角线和反对角线),但官方的公共函数只接受一个参数,递归是在内部处理的。