web-dev-qa-db-fra.com

Qu'est-ce qu'un terme pour une fonction qui, lorsqu'elle est appelée à plusieurs reprises, a le même effet que d'appeler une fois?

(En supposant un environnement monothread)

Une fonction qui remplit ce critère est:

bool MyClass::is_initialized = false;

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

En substance, je peux appeler cette fonction plusieurs fois et ne pas m'inquiéter de l'initialiser plusieurs fois MyClass

Une fonction qui ne remplit pas ce critère pourrait être:

Foo* MyClass::ptr = NULL;

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

Appeler initialize() plusieurs fois entraînera une fuite de mémoire

Motivation

Ce serait bien d'avoir un seul mot concis pour décrire ce comportement afin que les fonctions qui devraient répondre à ce critère puissent être dûment commentées (particulièrement utile lors de la description des fonctions d'interface qui devraient être remplacées)

98
Rufus

Ce type de fonction/opération est appelé Idempotent

L'idempotence (UK:/ˌɪdɛmˈpoʊtəns /, [1] US:/ˌaɪdəm - /) [2] est la propriété de certaines opérations en mathématiques et en informatique grâce auxquelles elles peuvent être appliquées plusieurs fois sans changer le résultat au-delà de l'application initiale.

En mathématiques, cela signifie que si f est idempotent, f ( f (x)) = f (x), ce qui revient à dire f f = f.

En informatique, cela signifie que si f(x); est idempotent, f(x); est identique à f(x); f(x);.

Remarque: Ces significations semblent différentes, mais sous la sémantique dénotationnelle de l'état , le mot "idempotent" a en fait le même exact ce qui signifie à la fois en mathématiques et en informatique.

244
Rufus

Le terme précis pour cela (comme Woofas mentionne ) est idempotence. Je voulais ajouter que pendant que vous pouviez appeler votre func1 méthode idempotente, vous ne pouvez pas l'appeler une fonction pure . Les propriétés d'une fonction pure sont deux: elle doit être idempotente et ne pas avoir d'effets secondaires, c'est-à-dire pas de mutation des variables statiques locales, des variables non locales, des arguments de référence mutables ou des flux d'E/S.

La raison pour laquelle je mentionne cela est qu'une fonction idempotente avec des effets secondaires n'est pas bonne non plus, car techniquement idempotente se réfère à la sortie de retour de la fonction, et non aux effets secondaires. Donc techniquement, votre func2 la méthode est idempotente, car la sortie ne change pas en fonction de l'entrée.

Vous voudrez probablement spécifier que vous voulez une fonction pure. Un exemple de fonction pure peut être le suivant:

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

Plus de lecture peut être trouvée dans l'article Wikipedia "Fonction pure" .

49
Neil

Le terme est Idempotence . Notez ci-dessous qu'il existe une différence distincte entre une fonction idempotente (appelée récursivement sur elle-même; deuxième bloc de code et la définition mathématique), et l'idempotence fonctionnelle (appelée à plusieurs reprises avec la même entrée séquentiellement; premier bloc de code et souvent le terme signifié dans la programmation).

Une fonction f avec effets secondaires est dite idempotente sous la composition séquentielle f; f si, lorsqu'il est appelé deux fois avec la même liste d'arguments, le deuxième appel n'a aucun effet secondaire et renvoie la même valeur que le premier appel [citation nécessaire] (en supposant qu'aucune autre procédure n'a été appelée entre la fin du premier appel et le début du deuxième appel).

Par exemple, considérez le code Python suivant:

x = 0

def setx(n):
    global x
    x = n

setx(5)
setx(5)

Ici, setx est idempotent car le deuxième appel à setx (avec le même argument) ne change pas l'état du programme visible: x était déjà défini à 5 lors du premier appel, et est à nouveau défini à 5 lors du deuxième appel, conservant ainsi la même valeur. Notez que ceci est distinct de l'idempotence sous la composition de fonction f ∘ f. Par exemple, la valeur absolue est idempotente sous la composition de la fonction:

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

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

En physique, j'ai entendu cela appelé (projection:

une projection est une transformation linéaire [~ # ~] p [~ # ~] d'un espace vectoriel vers lui-même tel que P2 = P. Autrement dit, chaque fois que P est appliqué deux fois à n'importe quelle valeur, il donne le même résultat que s'il était appliqué une fois (idempotent).

Graphiquement, cela a du sens si vous regardez un dessin animé d'une projection vectorielle :

enter image description here

Dans l'image, a1 est la projection de a sur b, ce qui est comme la première application de votre fonction. Projections ultérieures de a1 sur b donne le même résultat a1. En d'autres termes, lorsque vous appelez une projection à plusieurs reprises, cela a le même effet qu'une seule fois.

Juste avertissement: je n'ai jamais entendu cela utilisé en dehors de la physique, donc à moins que vous n'ayez de tels types dans votre équipe, vous pourriez confondre tout le monde.

3
user1717828

C'est un algorithme déterministe car étant donné la même entrée (dans ce cas aucune entrée), il produira toujours la même sortie.

En informatique, un algorithme déterministe est un algorithme qui, étant donné une entrée particulière, produira toujours la même sortie, la machine sous-jacente passant toujours par la même séquence d'états. Les algorithmes déterministes sont de loin le type d'algorithme le plus étudié et le plus familier, ainsi que l'un des plus pratiques, car ils peuvent être exécutés efficacement sur des machines réelles.

Les bases de données SQL sont intéressées par Fonctions déterministes .

Une fonction déterministe donne toujours la même réponse lorsqu'elle a les mêmes entrées. La plupart des fonctions SQL intégrées dans SQLite sont déterministes. Par exemple, la fonction abs (X) renvoie toujours la même réponse tant que son entrée X est la même.

Une fonction doit être déterministe si elle est utilisée dans le calcul d'un indice.

Par exemple, dans SQLite, les fonctions non déterministes suivantes ne peuvent pas être utilisées dans un index: random(), changes(), last_insert_rowid() et sqlite3_version() .

3
Stephen Quan

En plus des autres réponses, s'il y a une entrée spécifique au functon qui a cette propriété, c'est un point fixe, point invariant ou point fixe de la fonction. Par exemple, 1 à n'importe quelle puissance est égal à 1, donc (1ⁿ) ⁿ = 1ⁿ = 1.

Le cas particulier d'un programme qui se produit en sortie est un quine.

3
Davislor