2012-02-11 18 views
2

再帰関数を記述するときに、再帰アルゴリズムの最初のパスでのみ何かが発生することがあります。これがtrueの場合、私は2つのオプション、再帰関数 - 2つの関数または最後のオプションパラメータ

  1. は、デフォルトでtrueに設定されますが再帰的に呼び出されたときには「最初の実行」と呼ばれるオプションのパラメータを持っている、引数がfalse
  2. は2つの機能
を持っています

どちらのオプションがお選びいただけますか?後者の場合は、これらの関数の名前を何にする必要がありますか? (例えば、そのフラッドフィルアルゴリズムでFloodFillFloodFillRecursiveを選択する場合)

ありがとうございます。

答えて

4

私は2つの関数を使用することがありますが、呼び出す関数の名前はFloodFillとする必要があります。ユーザーはその関数の実装方法を知る必要がないので、FloodFillRecursiveという名前を付けるべきではありません。


実際、FloodFillRecursiveインナー関数の名前とすることができる:インプリメンテーションを含むもの、その上でユーザによって呼び出さ一つによって呼び出され - それは再帰的である第二の関数であるように。
理想的には、その関数はユーザから見えないようにしてください。ライブラリーに隠されている必要があります(ユーザに直接呼び出さないように命じる命名規則を使用してください)

このようにして実装を変更した場合、ユーザーは再帰的になる可能性のないFloodFillRecursive関数を呼び出さなくなります。

+0

これはまさに私が考えていたものです。私はベストプラクティスを使用しているかどうかをチェックしていました。この質問を開いたままにして、他の回答があるかどうかを確認します。あなたのご意見ありがとうございます! – Ell

+0

あなたは大歓迎です:-) –

1

機能がサードパーティの開発者によって使用可能にされているかどうかは実際には異なります。そうであれば、2つ目の関数(FloodFillRecursive)をライブラリのプライベート/内部で使用することで、2つの関数アプローチを使い分けて使うのが望ましいかもしれません。

もしそうでなければ、オプションのパラメータの方法は問題ありません。

1

オプション2は、私が考えることができるすべての場合に優れています。これは使用している言語によって異なりますが、毎回追加の引数を渡すことで、大幅に(オーバーヘッドになる)オーバーヘッドが発生する可能性があります。

命名規則では、外部関数(FloodFillなど)には通常の名前を使用します。内部関数については、FloodFillRecursiveまたはFloodFillInnerが良い選択であると言います。

+0

ああ、私は頭上を考えなかった、ありがとう! – Ell

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