一个函数的术语是什么,当它被反复调用时,具有与一次调用相同的作用?


96

(假设是单线程环境)

满足此条件的功能是:

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()多次调用将导致内存泄漏

动机

最好有一个简洁的词来描述此行为,以便可以适当地注释预期符合此条件的功能(在描述预期被覆盖的接口功能时特别有用)


67
对接近投票者:确实,所有“关于事物的名称”问题中有99.999%(粗略估计)是题外话,因为它们没有单一,正确,明确,客观的答案,命名纯粹是主观的且基于意见的,这一点确实有一个唯一,正确,明确,客观的答案,这是由OP自己给出的。
约尔格W¯¯米塔格

30
多次调用确实有效果,因为可能会有其他代码在两者之间更改“ var”。
RemcoGerlich

7
为什么OP问问这个问题,为什么OP 问了?除了代表/积分/业力建设之外,还有其他原因吗?
dotancohen

13
@dotancohen Q / A风格的自我回答是StackExchange上的关键概念之一。
glglgl

17
@glglgl:我同意,有优点的问题。这个问题有什么好处?我非常担心,我们将开始让OP询问并立即回答每个CS 101问题,由OP询问并立即定义每个CS术语,然后询问每个基本算法的利弊,然后由OP立即回答(不一定是这个OP)。那是我们想要softwareengineering.SE的网站吗?
dotancohen

Answers:


244

这种类型的功能/操作称为幂等

幂等(英国:/ ˌɪdɛmˈpoʊtəns /,[1]美国:/ˌaɪdəm-/)[2]是数学和计算机科学中某些运算的属性,因此可以多次使用它们,而不会超出初次应用的结果。

在数学上,这意味着,如果˚F是幂等的,˚F˚F(X))= ˚F(X),这是相同的话说˚F˚F = ˚F

在计算机科学中,这意味着如果f(x);等幂,f(x);则与相同f(x); f(x);

注意:这些含义似乎有所不同,但是在状态指称语义下,“幂等”一词在数学和计算机科学中实际上具有相同的确切含义。


评论不作进一步讨论;此对话已转移至聊天
maple_shaft

51

精确的术语(如Woofas提到的)是幂等的。我想补充一点,尽管您可以将func1方法称为幂等的,但不能将其称为函数。纯函数的属性有两个:它必须是幂等的,并且必须没有副作用,也就是说,局部静态变量,非局部变量,可变引用参数或I / O流不会发生变异。

我之所以这样说,是因为具有幂等作用的幂等函数也不好,因为从技术上讲幂等是指函数的返回输出,而不是副作用。因此,从技术上讲,您的func2方法是幂等的,因为输出不会根据输入而更改。

您最有可能希望指定您想要一个纯函数。一个纯函数的示例可能如下:

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

可以在Wikipedia文章“ Pure function”中找到更多阅读内容


37
我认为您对幂等的定义太狭窄,或者换句话说,您使用的是幂等的数学定义,而不是编程方法。例如,精确地将PUTDELETE方法称为等幂,因为多次执行其副作用与仅执行一次具有相同的效果。您说的是“幂等f∘f = f”,而在编程中,我们的意思是“执行f与执行具有相同的效果f; f”。请注意,您可以通过添加“ world”参数轻松地将第二个含义转换为前一个含义。
约尔格W¯¯米塔格

23
@Neil“幂等性严格来说是一个数学术语。” 不,不是,它也用于网络和客户端服务器通信/分布式系统中,正如JörgWMittag所描述的那样。这是一个有用的概念,因为它允许对具有相同操作/消息的服务器/客户端的多个请求,而无需更改原始消息的设置。当您的通信不可靠并且需要重试命令时,这很有用,因为客户端消息已丢失或服务器已回复。
opa

7
您应该更详细地了解纯幂和幂幂之间的区别。您的示例func1不是幂等的,因为func1(1) != func1(func1(1))
Tezra

5
纯度和幂等性不同。纯函数不必在数学意义上是幂等的(就副作用而言,它显然是幂等的,因为它没有副作用)。幂等(从编程意义上来说)功能不一定是纯函数,例如由OP给出的例子。另外,如opa所述,等幂是有用的特性,其用途与纯度完全不同。您对纯度的定义是“幂等且没有副作用”,这是错误的,或者至少是误导性的,令人不快。
Frax

5
在编程的上下文中,没有“副作用”,但是如果要扩展定义以包括它,则幂等函数和纯函数将具有相同的含义。不,它们根本不是同一件事。等幂的,不是纯粹的:void f(int var) { someGlobalVariable = var; }。纯,不是幂等的:int func1(int var) { return var + 1; }
JLRishe

6

术语是幂等。下面请注意,幂等函数(对其进行递归调用;第二个代码块和数学定义)与功能幂等性(在相同的输入下依次调用;第一个代码块通常是编程中的术语)之间存在明显的区别。

具有副作用的功能f在顺序组成f下被认为是等幂的;f如果在使用相同的参数列表两次调用时,第二次调用没有副作用,并且返回的值与第一次调用相同,则返回[citation needed](假设在第一次调用的末尾与开始之间没有其他过程被调用)第二个通话)。

例如,考虑以下Python代码:

x = 0

def setx(n):
    global x
    x = n

setx(5)
setx(5)

这里,setx是幂等的,因为第二次调用setx(具有相同的参数)不会更改可见的程序状态:x在第一次调用中已经设置为5,在第二次调用中再次设置为5,因此保持相同的值。请注意,这与函数组合f∘f下的幂等性不同。例如,在函数组成下,绝对值是幂等的:

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

abs(-5) == abs(abs(-5)) == abs(5) == 5

3

在物理学中,我听说这被称为投影

一个突出部是线性变换P从一个向量空间本身,使得P 2 = P。也就是说,每当对任意值两次应用P时,其结果都与一次应用(幂等)的结果相同。

从图形上看,如果看一下矢量投影动画片,这是有意义的:

在此处输入图片说明

在图片中,a 1ab的投影,就像您的函数的第一个应用程序一样。随后突起一个1b给出相同的结果一个1。换句话说,当您反复调用投影时,其效果与一次调用相同。

合理的警告:我从来没有听说过在物理学之外使用过这种方法,因此,除非您在团队中拥有这些类型,否则您可能会混淆所有人。


2
这确实是一个很好的具体示例,说明了如何可视化幂等函数(在数学上,尤其是在矢量几何/线性代数场中)。尽管软件功能的“幂等”是一个非常接近的概念,但我认为开发人员/计算机科学家在这种情况下并不经常使用“ projection”一词(软件工程中的“ projection function”宁可指代带有对象的功能)并返回派生自该对象的新对象或该对象的属性,例如)
Pac0

2
@ Pac0哦,好的。我从事的是科学和编程之间的工作,但没有意识到这个词已经超载了。我可以想到一些使用此术语的人为设计示例,但我承认我与愿意每天忍受科学术语的人们一起工作:-)
user1717828

3

这是确定性算法,因为给定相同的输入(在这种情况下为无输入),它将始终产生相同的输出。

在计算机科学中,确定性算法是一种算法,在给定特定输入的情况下,它将始终产生相同的输出,而底层计算机始终通过相同的状态序列。确定性算法是迄今为止研究最多,最熟悉的算法,也是最实用的算法之一,因为确定性算法可以在真实机器上高效运行。

SQL数据库对确定性功能感兴趣。

当确定性函数具有相同的输入时,总是给出相同的答案。SQLite中的大多数内置SQL函数都是确定性的。例如,abs(X)函数始终返回相同的答案,只要其输入X相同即可。

如果函数用于计算索引,则必须是确定性的。

例如,SQLite中,下面的非确定性函数不能在索引使用:random()changes()last_insert_rowid()sqlite3_version()


6
询问者func2具有确定性(不涉及任何随机效应),但已声明违反了他所寻找的财产。
Draco18s

通过重复产生相同的结果与说通过嵌套或链接产生相同的结果不同。确定性函数对于缓存结果非常重要,比索引/散列更重要。
mckenzm

3

除了其他答案,如果函数的特定输入具有此属性,则它是函数的动点不变点不动点。例如,任意幂的1等于1,因此(1ⁿ)ⁿ=1ⁿ= 1。

产生自身作为输出的程序的特殊情况是一个quine


奎因对软件来说就像坎托对数学:-)一样。当然,quines不是幂等的-它们要么在输出已经存在时失败,要么“笨拙”先前的结果并编写新的尽管相同的输出。
卡尔·威索夫特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.