it-swarm.com.de

Was ist ein Begriff für eine Funktion, die bei wiederholtem Aufruf den gleichen Effekt hat wie ein einmaliger Aufruf?

(Angenommen, eine Single-Threaded-Umgebung)

Eine Funktion, die dieses Kriterium erfüllt, ist:

bool MyClass::is_initialized = false;

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

Im Wesentlichen kann ich diese Funktion mehrmals aufrufen und muss mir keine Sorgen machen, dass MyClass mehrmals initialisiert wird

Eine Funktion, die dieses Kriterium nicht erfüllt, könnte sein:

Foo* MyClass::ptr = NULL;

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

Das mehrmalige Aufrufen von initialize() führt zu einem Speicherverlust

Motivation

Es wäre schön, ein einziges prägnantes Wort zu haben, um dieses Verhalten zu beschreiben, damit Funktionen, von denen erwartet wird, dass sie dieses Kriterium erfüllen, ordnungsgemäß kommentiert werden können (besonders nützlich, wenn Schnittstellenfunktionen beschrieben werden, von denen erwartet wird, dass sie überschrieben werden).

98
Rufus

Diese Art von Funktion/Operation heißt Idempotent

Idempotenz (UK:/ˌɪdɛmˈpoʊtəns /, [1] US:/ˌaɪdəm - /) [2] ist die Eigenschaft bestimmter Operationen in Mathematik und Informatik, wobei sie mehrfach angewendet werden können, ohne das Ergebnis über die ursprüngliche Anwendung hinaus zu ändern.

In der Mathematik bedeutet dies, dass wenn f idempotent ist, f ( f (x)) = f (x), was gleichbedeutend ist mit f f = f.

In der Informatik bedeutet dies, dass wenn f(x); idempotent ist, f(x); dasselbe ist wie f(x); f(x);.

Hinweis: Diese Bedeutungen scheinen unterschiedlich zu sein, aber unter Bezeichnungssemantik des Zustands hat das Wort "idempotent" tatsächlich genau das gleiche Bedeutung sowohl in der Mathematik als auch in der Informatik.

244
Rufus

Der genaue Begriff dafür (wie Woofas erwähnt ) ist Idempotenz. Ich wollte hinzufügen, dass Sie zwar Ihre func1 - Methode idempotent aufrufen können, sie jedoch nicht als pure Funktion bezeichnen können. Die Eigenschaften einer reinen Funktion sind zwei: Sie muss idempotent sein und darf keine Nebenwirkungen haben, dh keine Mutation lokaler statischer Variablen, nicht lokaler Variablen, veränderlicher Referenzargumente oder E/A-Streams.

Der Grund, warum ich dies erwähne, ist, dass eine idempotente Funktion mit Nebenwirkungen auch nicht gut ist, da sich technisch idempotent auf die Rückgabe der Funktion und nicht auf die Nebenwirkungen bezieht. Technisch gesehen ist Ihre func2 - Methode also idempotent, da sich die Ausgabe nicht entsprechend der Eingabe ändert.

Sie möchten höchstwahrscheinlich angeben, dass Sie eine reine Funktion wünschen. Ein Beispiel für eine reine Funktion könnte wie folgt sein:

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

Weitere Informationen finden Sie im Wikipedia-Artikel "Pure function" .

49
Neil

Der Begriff ist Idempotenz . Beachten Sie unten, dass es einen deutlichen Unterschied zwischen einer Idempotenten Funktion (rekursiv auf sich selbst aufgerufen; zweiter Codeblock und die mathematische Definition) und einer funktionalen Idempotenz (wiederholt mit derselben Eingabe nacheinander aufgerufen; erster Codeblock und häufig der in der Programmierung bezeichnete Begriff) gibt.

Eine Funktion f mit Nebenwirkungen soll unter sequentieller Zusammensetzung f idempotent sein; f Wenn der zweite Aufruf bei zweimaligem Aufruf mit derselben Liste von Argumenten keine Nebenwirkungen hat und denselben Wert wie der erste Aufruf zurückgibt [Zitieren erforderlich] (vorausgesetzt, zwischen dem Ende des ersten Aufrufs und dem Start wurden keine anderen Prozeduren aufgerufen des zweiten Anrufs).

Betrachten Sie zum Beispiel den folgenden Python Code:

x = 0

def setx(n):
    global x
    x = n

setx(5)
setx(5)

Hier ist setx idempotent, da der zweite Aufruf von setx (mit demselben Argument) den sichtbaren Programmstatus nicht ändert: x wurde bereits beim ersten Aufruf auf 5 gesetzt und wird beim zweiten Aufruf erneut auf 5 gesetzt, wodurch der Wert beibehalten wird gleicher Wert. Beachten Sie, dass sich dies von der Idempotenz unter der Funktionszusammensetzung f ∘ f unterscheidet. Zum Beispiel ist der Absolutwert unter Funktionszusammensetzung idempotent:

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

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

In der Physik habe ich gehört, dass dies als Projektion bezeichnet wird:

eine Projektion ist eine lineare Transformation [~ # ~] p [~ # ~] von einem Vektorraum zu sich selbst, so dass P.2 = P. Das heißt, wenn P zweimal auf einen Wert angewendet wird, ergibt sich das gleiche Ergebnis, als ob es einmal angewendet worden wäre (idempotent).

Grafisch ist dies sinnvoll, wenn Sie sich einen Cartoon einer Vektorprojektion ansehen:

enter image description here

Auf dem Bild a1 ist die Projektion von a auf b, was wie die erste Anwendung Ihrer Funktion ist. Nachfolgende Projektionen von a1 on to b gib das gleiche Ergebnis a1. Mit anderen Worten, wenn Sie eine Projektion wiederholt aufrufen, hat dies den gleichen Effekt wie das einmalige Aufrufen.

Faire Warnung: Ich habe noch nie gehört, dass dies außerhalb der Physik verwendet wird. Wenn Sie also nicht über solche Typen in Ihrem Team verfügen, können Sie alle verwirren.

3
user1717828

Es ist ein deterministischer Algorithmus , da bei gleicher Eingabe (in diesem Fall keine Eingabe) immer dieselbe Ausgabe erzeugt wird.

In der Informatik ist ein deterministischer Algorithmus ein Algorithmus, der bei einer bestimmten Eingabe immer dieselbe Ausgabe erzeugt, wobei die zugrunde liegende Maschine immer dieselbe Folge von Zuständen durchläuft. Deterministische Algorithmen sind bei weitem die am besten untersuchten und bekanntesten Algorithmen sowie eine der praktischsten, da sie auf realen Maschinen effizient ausgeführt werden können.

SQL-Datenbanken interessieren sich für deterministische Funktionen .

Eine deterministische Funktion gibt immer die gleiche Antwort, wenn sie die gleichen Eingaben hat. Die meisten in SQLite integrierten SQL-Funktionen sind deterministisch. Beispielsweise gibt die Funktion abs (X) immer dieselbe Antwort zurück, solange ihre Eingabe X dieselbe ist.

Eine Funktion muss deterministisch sein, wenn sie zur Berechnung eines Index verwendet wird.

In SQLite können beispielsweise die folgenden nicht deterministischen Funktionen nicht in einem Index verwendet werden: random(), changes(), last_insert_rowid() und sqlite3_version() .

3
Stephen Quan

Zusätzlich zu den anderen Antworten ist, wenn es eine bestimmte Eingabe für die Funktion gibt, die diese Eigenschaft hat, ein fester Punkt, invarianter Punkt oder fester Punkt der Funktion. Zum Beispiel ist 1 zu jeder Potenz gleich 1, also ist (1ⁿ) ⁿ = 1ⁿ = 1.

Der Sonderfall eines Programms, das sich selbst als Ausgabe erzeugt, ist ein quine.

3
Davislor