web-dev-qa-db-ja.com

繰り返し呼び出されたときに1回呼び出したのと同じ効果を持つ関数の用語は何ですか?

(シングルスレッド環境を想定)

この基準を満たす関数は次のとおりです。

_bool MyClass::is_initialized = false;

void MyClass::lazy_initialize()
{
    if (!is_initialized)
    {
        initialize(); //Should not be called multiple times
        is_initialized = true;
    }
}
_

本質的に、私はこの関数を複数回呼び出すことができ、MyClassを複数回初期化することについて心配する必要はありません

この基準を満たさない関数は次のとおりです。

_Foo* MyClass::ptr = NULL;

void initialize()
{
    ptr = new Foo();
}
_

initialize()を複数回呼び出すと、メモリリークが発生します

動機

この動作を説明する簡潔なWordを1つ用意して、この基準を満たすことが期待される関数に適切にコメントできるようにすると便利です(特に、オーバーライドされることが期待されるインターフェイス関数を説明するときに役立ちます)。

98
Rufus

このタイプの関数/操作は べき等)と呼ばれます==

べき等(英国:/ ˌɪdɛmˈpoʊtəns /、[1]米国:/ˌaɪdəm-/)[2]は、最初のアプリケーションを超えて結果を変更せずに複数回適用できる数学およびコンピューターサイエンスの特定の操作のプロパティです。

数学では、これは、fがべき等である場合、ff (x)f(x)、これはffと同じです=f

コンピュータサイエンスでは、これは、f(x);がべき等である場合、f(x);f(x); f(x);と同じであることを意味します。

注:これらの意味は異なっているように見えますが、 状態の陳述意味論 の下では、「べき等」という単語は実際にはまったく同じです数学とコンピュータサイエンスの両方で意味を持っています。

244
Rufus

これの正確な用語( Woofasの言及 のように)はべき等です。 func1メソッドべき等、pure関数と呼ぶことはできません。純粋関数のプロパティは2つです。べき等である必要があり、副作用がないこと、つまり、ローカル静的変数、非ローカル変数、可変参照引数、またはI/Oストリームの変更がないこと。

私がこれを述べた理由は、技術的にべき等とは関数の戻り出力を指し、副作用ではないため、副作用のあるべき等関数も良くないためです。だから技術的にあなたのfunc2メソッドは、出力が入力に従って変化しないため、べき等です。

ほとんどの場合、純粋な関数が必要であることを指定する必要があります。純関数の例は次のとおりです。

int func1(int var)
{
    return var + 1;
}

Wikipediaの記事「Pure function」で詳細を確認できます

49
Neil

用語は べき等 です。べき等関数(それ自体で再帰的に呼び出されます; 2番目のコードブロックと数学的な定義)と関数のべき等性(同じ入力で連続的に呼び出されます;最初のコードブロックとしばしばプログラミングで意味される用語)の間に明確な違いがあることに注意してください。

副作用のある関数fは、逐次合成fの下ではべき等であると言われています。 f同じ引数リストで2回呼び出された場合、2番目の呼び出しには副作用がなく、最初の呼び出しと同じ値を返します[引用が必要](最初の呼び出しの終わりから開始までの間に他のプロシージャが呼び出されなかった場合) 2番目の呼び出しの)。

たとえば、次のPythonコードを検討してください。

x = 0

def setx(n):
    global x
    x = n

setx(5)
setx(5)

ここで、setxは、同じ引数を持つsetxへの2回目の呼び出しでは可視のプログラム状態が変更されないため、べき等です。同じ値。これは、関数合成f∘fでのべき等とは異なります。たとえば、絶対値は関数構成ではべき等です。

def abs(n):
    if n < 0:
        return -n
    else:
        return n

abs(-5) == abs(abs(-5)) == abs(5) == 5
6
Tezra

物理学では、これがprojectionと呼ばれることを聞いたことがあります。

射影は、ベクトル空間からそれ自身への線形変換[〜#〜] p [〜#〜]であり、P2 = P。つまり、Pが任意の値に2回適用されると、1回適用された場合と同じ結果が得られます(べき等)。

グラフィック的に、これは ベクトル投影の漫画 を見ると意味があります。

enter image description here

写真では、a1は、abへの射影です。これは、関数の最初のアプリケーションのようなものです。 aの後続の予測1onb同じ結果a1。つまり、プロジェクションを繰り返し呼び出すと、プロジェクションを1回呼び出すのと同じ効果があります。

公正な警告:これが物理学以外で使用されることは聞いたことがありません。そのため、チームでこれらのタイプを使用しないと、誰もが混乱する可能性があります。

3
user1717828

同じ入力(この場合は入力なし)を指定すると、常に同じ出力が生成されるため、これは 決定論的アルゴリズム です。

コンピュータサイエンスでは、決定論的アルゴリズムとは、特定の入力が与えられると、常に同じ出力を生成するアルゴリズムであり、基盤となるマシンは常に同じ状態のシーケンスを通過します。決定論的アルゴリズムは、実際のマシンで効率的に実行できるため、これまでで最もよく研​​究され、よく知られているアルゴリズムであり、最も実用的なアルゴリズムの1つです。

SQLデータベースは 確定的関数 に関心があります。

決定論的関数は、同じ入力がある場合、常に同じ答えを返します。 SQLiteのほとんどの組み込みSQL関数は確定的です。たとえば、abs(X)関数は、入力Xが同じである限り、常に同じ回答を返します。

関数は、インデックスの計算に使用される場合、確定的でなければなりません。

たとえば、SQLiteでは、次の非決定的関数はインデックスで使用できません:random()changes()last_insert_rowid()およびsqlite3_version()

3
Stephen Quan

他の回答に加えて、このプロパティを持つ関数への特定の入力がある場合、それは固定小数点不変点またはfixpoint関数。たとえば、1の累乗は1に等しいため、(1ⁿ)ⁿ=1ⁿ= 1になります。

それ自体を出力として生成するプログラムの特殊なケースは、quineです。

3
Davislor