(Предполагая однопоточную среду)
Функция, которая удовлетворяет этому критерию:
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()
Многократный вызов вызовет утечку памяти
мотивация
Было бы неплохо иметь одно краткое слово, чтобы описать это поведение, чтобы можно было должным образом прокомментировать функции, которые должны соответствовать этому критерию (особенно полезно при описании функций интерфейса, которые, как ожидается, будут переопределены)
Ответы:
Этот тип функции / операции называется идемпотентом
В математике это означает, что если f идемпотент, f ( f (x)) = f (x), что то же самое, что сказать f ∘ f = f .
В информатике это означает, что если
f(x);
идемпотент,f(x);
то же самое, что иf(x); f(x);
.Примечание: эти значения кажутся разными, но в денотационной семантике государства слово «идемпотент» фактически имеет одинаковое точное значение как в математике, так и в информатике.
источник
Точный термин для этого (как упоминает Вуфас ) - идемпотентность. Я хотел бы добавить, что хотя вы можете называть свой
func1
метод идемпотентным, вы не можете называть его чистой функцией. Свойства чистой функции два: она должна быть идемпотентной и не должна иметь побочных эффектов, то есть не иметь мутаций локальных статических переменных, нелокальных переменных, изменяемых ссылочных аргументов или потоков ввода-вывода.Причина, по которой я упоминаю это, состоит в том, что идемпотентная функция с побочными эффектами также не годится, поскольку технически идемпотентный относится к возвратному результату функции, а не к побочным эффектам. Так что технически ваш
func2
метод идемпотентен, поскольку выход не меняется в зависимости от ввода.Скорее всего, вы хотите указать, что вы хотите чистую функцию. Пример чистой функции может быть следующим:
Больше чтения можно найти в статье в Википедии "Чистая функция" .
источник
PUT
иDELETE
HTTP называются идемпотентными именно потому, что выполнение их побочных эффектов несколько раз имеет тот же эффект, что и выполнение их только один раз. Вы говорите «идемпотентность означаетf∘f = f
», тогда как в программировании мы имеем в виду «выполнениеf
имеет тот же эффект, что и выполнениеf; f
». Обратите внимание, что вы можете легко преобразовать второе значение в первое, добавив параметр "world".func1(1) != func1(func1(1))
.void f(int var) { someGlobalVariable = var; }
. Чисто, не идемпотентноint func1(int var) { return var + 1; }
.Термин идемпотентность . Обратите внимание, что между идемпотентной функцией (рекурсивно вызываемой сам по себе; второй блок кода и математическим определением) существует четкое различие и идемпотентность по функциональности (вызывается повторно с одним и тем же вводом последовательно; первый блок кода и часто используется в программировании).
источник
В физике я слышал, что это называется проекцией :
Графически это имеет смысл, если вы посмотрите на карикатуру векторной проекции :
На рисунке a 1 - это проекция a на b , которая похожа на первое применение вашей функции. Последующие проекции a 1 на b дают тот же результат a 1 . Другими словами, когда вы вызываете проекцию несколько раз, это имеет тот же эффект, что и вызов ее один раз.
Справедливое предупреждение: я никогда не слышал, чтобы это использовалось вне физики, поэтому, если у вас нет таких типов в вашей команде, вы можете запутать всех.
источник
Это детерминированный алгоритм, потому что при одинаковом входе (в данном случае без ввода) он всегда будет давать одинаковый выход.
Базы данных SQL интересуются детерминированными функциями .
Функция должна быть детерминированной, если она используется при расчете индекса.
Например, в SQLite, следующие недетерминированные функции не могут быть использованы в качестве индекса:
random()
,changes()
,last_insert_rowid()
иsqlite3_version()
.источник
func2
является детерминированным (без случайных эффектов), но уже объявлен нарушающим свойство, которое он ищет.В дополнение к другим ответам, если есть определенный вход для функции, обладающей этим свойством, это фиксированная точка , инвариантная точка или точка фиксации функции. Например, 1 для любой степени равен 1, поэтому (1ⁿ) ⁿ = 1ⁿ = 1.
Особый случай программы, которая производит себя как выходные данные, - это квин .
источник