किसी फ़ंक्शन के लिए एक शब्द क्या है जिसे बार-बार कहा जाता है, एक बार कॉल करने के समान प्रभाव पड़ता है?


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% (मोटे अनुमान) प्रश्न ऑफ़-टॉपिक हैं क्योंकि उनके पास एक भी, सही, अस्पष्ट, उद्देश्यपूर्ण उत्तर नहीं है और नामकरण विशुद्ध रूप से व्यक्तिपरक और राय-आधारित है, यह एक करता है एक एकल, सही, स्पष्ट, उद्देश्य जवाब है, जो ओ पी खुद द्वारा दिया गया था की है।
जोर्ग डब्ल्यू मित्तग

30
यह कॉलिंग कई बार करता है , एक प्रभाव है के रूप में वहाँ अन्य कोड है कि दोनों के बीच में 'var' बदल हो सकता है।
रेमकोगर्लिच

7
यह सवाल क्यों पूछा गया था, अगर ओपी को पूछने के समय जवाब पता था ? क्या रेप / पॉइंट्स / कर्म बिल्डिंग के अलावा कोई कारण है?
dotancohen

13
@dotancohen Q / एक स्टाइल स्व-उत्तर देना StackExchange पर प्रमुख अवधारणाओं में से एक है।
glglgl

17
@glglgl: मैं सहमत हूं, योग्यता के साथ प्रश्नों के लिए। इस प्रश्न में क्या योग्यता है? मुझे गंभीरता से चिंता है कि हम हर एक सीएस 101 सवाल पूछना शुरू कर देंगे और तुरंत ओपी द्वारा उत्तर दिया जाएगा, हर एक सीएस शब्द पूछा और तुरंत ओपी द्वारा परिभाषित किया गया है, और हर बुनियादी एल्गोरिथ्म के पेशेवरों और विपक्ष ने सवाल किया तो तुरंत ओपी द्वारा उत्तर दिया गया ( जरूरी नहीं कि यह ओपी)। क्या वह साइट जिसे हम सॉफ्टवेयरइन्जिनियरिंग चाहते हैं। वह होना चाहिए?
dotancohen

जवाबों:


244

इस प्रकार के फ़ंक्शन / संचालन को Idempotent कहा जाता है

Idempotence (UK: / ˌɪdotmʊpoət /ns /, [1] US: / əa --dˌm - /) [2] गणित और कंप्यूटर विज्ञान में कुछ संचालन की संपत्ति है जिसके द्वारा प्रारंभिक आवेदन से परे परिणाम बदले बिना उन्हें कई बार लागू किया जा सकता है।

गणित में, इसका मतलब है कि यदि idempotent, है ( (x)) = (x) है, जो कह रही है के रूप में ही है =

कंप्यूटर विज्ञान में, इसका मतलब यह है कि अगर f(x);कोई व्यक्ति बेरोजगार है, तो f(x);जैसा है वैसा ही है f(x); f(x);

नोट: ये अर्थ अलग-अलग प्रतीत होते हैं, लेकिन राज्य के शब्दार्थ अर्थ के तहत , शब्द "idempotent" वास्तव में गणित और कंप्यूटर विज्ञान दोनों में एक ही सटीक अर्थ है।


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
maple_shaft

51

इस के लिए सटीक शब्द (के रूप में Woofas का उल्लेख है ) idempotence है। मैं यह जोड़ना चाहता था कि जब आप अपनी func1विधि को उदासीन कह सकते हैं , तो आप इसे शुद्ध कार्य नहीं कह सकते । एक शुद्ध कार्य के गुण दो हैं: यह अनिवार्य होना चाहिए और इसके साइड इफेक्ट्स नहीं होने चाहिए, जो यह कहना है कि स्थानीय स्थैतिक चर, गैर-स्थानीय चर, उत्परिवर्ती संदर्भ तर्क या I / O धाराओं का कोई म्यूटेशन नहीं है।

इसका उल्लेख करने का कारण यह है कि साइड इफेक्ट्स के साथ एक सुखद फ़ंक्शन या तो अच्छा नहीं है, क्योंकि तकनीकी रूप से idempotent फ़ंक्शन के रिटर्न आउटपुट को संदर्भित करता है, और साइड इफेक्ट्स को नहीं। इसलिए तकनीकी रूप से आपकी func2विधि निष्प्राण है, क्योंकि इनपुट के अनुसार आउटपुट नहीं बदलता है।

आप सबसे अधिक यह निर्दिष्ट करना चाहते हैं कि आप एक शुद्ध कार्य चाहते हैं। शुद्ध कार्य का एक उदाहरण इस प्रकार हो सकता है:

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

विकिपीडिया लेख "शुद्ध कार्य" में अधिक पढ़ने को मिल सकता है


37
मुझे लगता है कि आपकी बेरोजगारी की परिभाषा बहुत संकीर्ण है, या एक और तरीका है, आप किसी एक प्रोग्रामिंग की नहीं, बल्कि बेवकूफी की गणितीय परिभाषा का उपयोग कर रहे हैं। उदाहरण के लिए, HTTP PUTऔर DELETEHTTP विधियों को ठीक- ठाक कहा जाता है क्योंकि कई बार उनके साइड-इफेक्ट्स को निष्पादित करने का एक ही प्रभाव होता है। आप कह रहे हैं "idempotency का अर्थ है f∘f = f", जबकि प्रोग्रामिंग में, हमारा मतलब है "निष्पादित करने fका एक ही प्रभाव होता है निष्पादन f; f"। ध्यान दें कि आप आसानी से "दुनिया" पैरामीटर जोड़कर दूसरे अर्थ को पूर्व में बदल सकते हैं।
जोर्ग डब्ल्यू मित्तग

23
@ नील "इम्पोटोटेंसी एक गणितीय शब्द है।" नहीं, यह भी नेटवर्किंग और क्लाइंट सर्वर संचार / वितरित प्रणालियों में उपयोग नहीं किया जाता है और JörgWMittag के रूप में वर्णित है। इसकी एक उपयोगी अवधारणा है क्योंकि यह एक ही ऑपरेशन / संदेश के साथ एक सर्वर / क्लाइंट के लिए कई अनुरोधों को बदलने की अनुमति देता है जो उस मूल संदेश को बदलने के लिए सेट करता है। यह तब उपयोगी होता है जब आपके पास अविश्वसनीय संचार होता है, और आपको एक कमांड को पुनः प्राप्त करने की आवश्यकता होती है क्योंकि या तो क्लाइंट संदेश गिरा दिया गया था या सर्वर रिप्लाई था।
ओपा

7
आपको शुद्ध और बेकार के अंतर के बारे में अधिक विस्तार से जाना चाहिए। आपका उदाहरण func1 क्योंकि idempotent नहीं है func1(1) != func1(func1(1))
तीज्रा

5
पवित्रता और मूर्खता अलग हैं। एक शुद्ध कार्य को गणितीय अर्थों में उदासीन होना आवश्यक नहीं है (यह साइड-इफ़ेक्ट के संदर्भ में स्पष्ट रूप से उदासीन है, क्योंकि यह कोई भी नहीं है)। आदर्श (प्रोग्रामिंग अर्थ में) फ़ंक्शन को शुद्ध नहीं होना चाहिए, जैसा कि ओपी द्वारा दिया गया है। इसके अलावा, जैसा कि ओपा ने उल्लेख किया है, आलस्य एक उपयोगी संपत्ति है जिसमें शुद्धता की तुलना में कड़ाई से उपयोग होता है। शुद्धता के बारे में आपकी परिभाषा "बेकार और बिना किसी दुष्प्रभाव के" गलत या कम से कम भ्रामक है।
फ्रैक्स

5
प्रोग्रामिंग के संदर्भ में, कोई "साइड इफेक्ट्स" नहीं हैं, लेकिन अगर आपको इसे शामिल करने के लिए परिभाषा का विस्तार करना था, तो एक आदर्श कार्य और शुद्ध कार्य का मतलब एक ही होगा। नहीं, वे एक ही बात का मतलब नहीं होगा। निष्काम, शुद्ध नहीं void f(int var) { someGlobalVariable = var; }:। शुद्ध, न कि उदासीन int func1(int var) { return var + 1; }:।
JLRishe

6

टर्म इम्पोटोटेंस है । नीचे ध्यान दें कि एक Idempotent फ़ंक्शन (स्वयं पर पुनरावर्ती कॉल; दूसरा कोड ब्लॉक और गणितीय परिभाषा), और कार्यात्मक idempotence (समान इनपुट क्रमिक रूप से बार-बार कॉल किया जाता है; पहले कोड ब्लॉक और अक्सर प्रोग्रामिंग में अर्थ होता है) के बीच एक अलग अंतर है।

साइड एफ इफेक्ट के साथ एक फ़ंक्शन एफ को अनुक्रमिक रचना एफ के तहत बेरोजगार कहा जाता है; च, यदि दो बार तर्कों की सूची के साथ दो बार कॉल किया जाता है, तो दूसरी कॉल का कोई दुष्प्रभाव नहीं होता है और पहली कॉल [उद्धरण] की आवश्यकता के समान मूल्य देता है (यह मानते हुए कि पहली कॉल के अंत और शुरुआत के बीच कोई अन्य प्रक्रिया नहीं कहा गया था) दूसरी कॉल का)।

उदाहरण के लिए, निम्नलिखित पायथन कोड पर विचार करें:

x = 0

def setx(n):
    global x
    x = n

setx(5)
setx(5)

यहाँ, setx idempotent है क्योंकि 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

भौतिकी में मैंने इसे एक प्रक्षेपण के रूप में संदर्भित सुना है :

एक प्रक्षेपण एक वेक्टर स्थान से एक रैखिक परिवर्तन पी है जो कि पी 2 = पी है । यही है, जब भी पी को किसी भी मूल्य पर दो बार लागू किया जाता है, तो यह उसी तरह का परिणाम देता है जैसे कि इसे एक बार लागू किया गया था।

यदि आप एक वेक्टर प्रक्षेपण के कार्टून को देखते हैं, तो यह समझ में आता है :

यहाँ छवि विवरण दर्ज करें

चित्र में, एक 1 का प्रक्षेपण है एक के लिए पर है, जो अपने कार्य के पहले आवेदन की तरह है। के बाद के अनुमानों एक 1 के लिए पर एक ही परिणाम देने के एक 1 । दूसरे शब्दों में, जब आप किसी प्रक्षेपण को बार-बार कहते हैं, तो उसका एक बार कॉल करने के समान प्रभाव पड़ता है।

निष्पक्ष चेतावनी: मैंने कभी भी भौतिकी के बाहर इसका उपयोग नहीं किया है, इसलिए जब तक आप अपनी टीम पर उन प्रकारों के बारे में नहीं जानते हैं, तब तक आप सभी को भ्रमित कर सकते हैं।


2
यह वास्तव में एक अच्छा ठोस उदाहरण है कि किस तरह से एक निष्पादक कार्य की कल्पना की जा सकती है (गणितीय रूप से और विशेष रूप से वेक्टर ज्यामिति / रैखिक बीजगणित क्षेत्र में)। जबकि सॉफ़्टवेयर फ़ंक्शन का "आइडम्पोटेंस" वास्तव में एक करीबी अवधारणा है, मुझे नहीं लगता कि डेवलपर्स / कंप्यूटर वैज्ञानिक अक्सर इस संदर्भ में "प्रोजेक्शन" शब्द का उपयोग करते हैं (सॉफ्टवेयर इंजीनियरिंग में एक "प्रोजेक्शन फ़ंक्शन" एक फ़ंक्शन का संदर्भ देगा जो एक ऑब्जेक्ट लेता है और इससे प्राप्त एक नई वस्तु, या उस वस्तु की एक संपत्ति, उदाहरण के लिए)
Pac0

2
@ Pac0 ओह, ठीक है। मैं विज्ञान और प्रोग्रामिंग के बीच फ्रिंज पर काम करता हूं, और यह महसूस नहीं किया कि शब्द पहले से ही ओवरलोड था। मैं काम पर कुछ वंचित उदाहरणों के बारे में सोच सकता हूं जहां मैं इस शब्दावली का उपयोग करूंगा, लेकिन मैंने उन लोगों के साथ काम किया है जो दैनिक विज्ञान विज्ञान के साथ काम करने को तैयार हैं :-)
user1717828

3

यह एक नियतात्मक एल्गोरिथ्म है क्योंकि एक ही इनपुट (इस मामले में कोई इनपुट नहीं) दिया गया है, यह हमेशा एक ही आउटपुट का उत्पादन करेगा।

कंप्यूटर विज्ञान में, एक नियतात्मक एल्गोरिथ्म एक एल्गोरिथ्म है, जो एक विशेष इनपुट दिया जाता है, हमेशा एक ही आउटपुट का उत्पादन करेगा, अंतर्निहित मशीन हमेशा राज्यों के समान अनुक्रम से गुजरती है। नियतात्मक एल्गोरिदम अब तक का सबसे अधिक अध्ययन और परिचित प्रकार का एल्गोरिथ्म है, साथ ही सबसे व्यावहारिक में से एक है, क्योंकि उन्हें वास्तविक मशीनों पर कुशलतापूर्वक चलाया जा सकता है।

SQL डेटाबेस नियतात्मक कार्यों में रुचि रखते हैं ।

एक नियतात्मक कार्य हमेशा एक ही उत्तर देता है जब उसके पास समान इनपुट होते हैं। अधिकांश बिल्ट-इन SQL फ़ंक्शन SQLite में नियतात्मक होते हैं। उदाहरण के लिए, एब्स (एक्स) फ़ंक्शन हमेशा एक ही उत्तर देता है जब तक कि उसका इनपुट एक्स एक ही हो।

यदि किसी इंडेक्स की गणना में इसका उपयोग किया जाता है, तो एक फ़ंक्शन नियतात्मक होना चाहिए।

उदाहरण के लिए, SQLite में, निम्नलिखित गैर नियतात्मक कार्यों एक सूचकांक में इस्तेमाल नहीं किया जा सकता: random(), changes(), last_insert_rowid()और sqlite3_version()


6
पूछने func2वाला नियतात्मक है (इसमें कोई यादृच्छिक प्रभाव शामिल नहीं हैं), लेकिन पहले से ही उस संपत्ति का उल्लंघन करने के रूप में घोषित किया गया है जिसे वह ढूंढ रहा है।
ड्रेको १18

उसी परिणाम को पुनरावृत्ति द्वारा उत्पादित किया जाता है, यह कहते हुए समान नहीं है कि परिणाम एक ही परिणाम नेस्टिंग या चेनिंग द्वारा उत्पन्न होता है। नियतात्मक कार्य कैशिंग परिणामों के लिए महत्वपूर्ण हैं, इंडेक्सिंग / हैशिंग के लिए अधिक से अधिक।
mckenzm

3

अन्य उत्तर के अलावा, अगर वहाँ functon इस संपत्ति है कि करने के लिए एक विशिष्ट इनपुट है, यह एक है नियत बिन्दु , अपरिवर्तनीय बिंदु या fixpoint समारोह का। उदाहरण के लिए, 1 से किसी भी शक्ति 1 के बराबर है, इसलिए (1ⁿ) ⁿ = 1 1 = 1।

एक प्रोग्राम का विशेष मामला जो आउटपुट के रूप में खुद को पैदा करता है, वह एक क्वीन है


कैंटेर सेट को गणित के रूप में उद्धृत करना सॉफ्टवेयर :-) हैं। और निश्चित रूप से quines आलसी नहीं हैं - वे तब विफल होते हैं जब आउटपुट पहले से मौजूद होता है या वे पिछले परिणाम को "क्लोबर" करते हैं और एक नया लिखते हैं, समान आउटपुट।
कार्ल विटथॉफ्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.