একটি ফাংশনটির জন্য কোন শব্দটি যা বারবার বলা হয়, একবার কল করার মত একই প্রভাব ফেলে?


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
এই প্রশ্নটি কেন জিজ্ঞাসা করা হয়েছিল, যদি ওপি জিজ্ঞাসার সময় উত্তরটি জানত ? রেপ / পয়েন্ট / কর্ম বিল্ডিং ছাড়া অন্য কোনও কারণ আছে কি?
ডটানকোহেন

13
@ ডটানকোহেন কিউ / একটি স্টাইলের স্ব-উত্তর দেওয়া স্ট্যাকএক্সচেঞ্জের অন্যতম মূল ধারণা।
glglgl

17
@glglgl: যোগ্যতার সাথে প্রশ্নাবলীর জন্য আমি সম্মত এই প্রশ্নটি কি যোগ্যতার? আমি গুরুতরভাবে উদ্বিগ্ন যে আমরা প্রতিটি সিএস 101 প্রশ্ন জিজ্ঞাসা করা এবং তাত্ক্ষণিকভাবে ওপি দ্বারা উত্তর দেওয়া শুরু করব, প্রতিটি সিএস শব্দটি জিজ্ঞাসা করা হয়েছিল এবং তাত্ক্ষণিকভাবে ওপি দ্বারা সংজ্ঞায়িত করা হয়েছে, এবং প্রতিটি মৌলিক অ্যালগরিদমের কার্যকরী বিষয়গুলি এবং তত্ক্ষণাত ওপি দ্বারা উত্তর দেওয়া হয়েছে ( অগত্যা এই ওপি)। আমরা যে সাইটটি সফটওয়্যারেনজিনিয়ারিং.এসই চাই তা কি সেই সাইট?
dotancohen

উত্তর:


244

এই জাতীয় ফাংশন / অপারেশনকে আইডেম্পোটেন্ট বলা হয়

আইডেম্পোটেন্স (ইউকে: / অ্যাডেম্পপ্যাটিনস /, [১] মার্কিন যুক্তরাষ্ট্র / / অ্যাডমডম - /) [২] হ'ল গণিত এবং কম্পিউটার বিজ্ঞানের নির্দিষ্ট ক্রিয়াকলাপের সম্পত্তি যার দ্বারা প্রাথমিক প্রয়োগের বাইরে ফলাফল পরিবর্তন না করে একাধিকবার প্রয়োগ করা যেতে পারে।

গণিত দাঁড়াচ্ছে এই যে, যে যদি idempotent হয় ( (x) এর) = (x) এর, যা বলার অপেক্ষা রাখে না হিসাবে একই =

কম্পিউটার বিজ্ঞানে এর অর্থ হ'ল যদি f(x);আদর্শবান f(x);হয় তবে একইরকম f(x); f(x);

দ্রষ্টব্য: এই অর্থগুলি পৃথক বলে মনে হয়, তবে রাষ্ট্রের ডোনোটেশনাল শব্দার্থবিদ্যার অধীনে , "আইডেম্পোটেন্ট" শব্দের আসলে গণিত এবং কম্পিউটার বিজ্ঞান উভয় ক্ষেত্রেই একইরকম অর্থ রয়েছে।


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
maple_shaft

51

এর জন্য সুনির্দিষ্ট শব্দটি (যেমন ওওফাস উল্লেখ করেছেন ) আদর্শভাব is আমি এটি যুক্ত করতে চেয়েছিলাম যখন আপনি আপনার func1পদ্ধতিটিকে আদর্শবান বলতে পারেন, আপনি এটিকে একটি খাঁটি ফাংশন বলতে পারেন না । খাঁটি ফাংশনটির বৈশিষ্ট্য দুটি: এটি অবশ্যই আদর্শবান হতে হবে এবং এর কোনও পার্শ্ব প্রতিক্রিয়া থাকতে হবে না, যা বলতে গেলে স্থানীয় স্ট্যাটিক ভেরিয়েবল, অ-স্থানীয় ভেরিয়েবল, পরিবর্তনীয় রেফারেন্স আর্গুমেন্ট বা আই / ও স্ট্রিমের কোনও রূপান্তর নেই।

আমি এর উল্লেখ করার কারণটি হ'ল পার্শ্ব প্রতিক্রিয়া সহ আদর্শবাদী ফাংশনটিও ভাল নয়, কারণ প্রযুক্তিগতভাবে আদর্শবান্ধব ফাংশনের রিটার্ন আউটপুটকে বোঝায়, এবং পার্শ্ব প্রতিক্রিয়াগুলিকে নয়। প্রযুক্তিগতভাবে আপনার func2পদ্ধতিটি আদর্শবান, কারণ ইনপুট অনুসারে আউটপুট পরিবর্তন হয় না।

আপনি সম্ভবত একটি বিশুদ্ধ ফাংশন চান তা নির্দিষ্ট করতে চান। খাঁটি ফাংশনের উদাহরণ নিম্নরূপ হতে পারে:

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

আরও পড়া উইকিপিডিয়া নিবন্ধ "খাঁটি ফাংশন" পাওয়া যাবে


37
আমি মনে করি আপনার আদর্শের সংজ্ঞাটি খুব সংকীর্ণ, বা অন্য কোনও উপায়ে বলছেন, আপনি প্রোগ্রামিংয়ের মতো নয়, আদর্শের সংখ্যার গাণিতিক সংজ্ঞাটি ব্যবহার করছেন। উদাহরণস্বরূপ, PUTএবং DELETEএইচটিটিপি পদ্ধতিগুলিকে যথাযথভাবে আইডেম্পোটেন্ট বলা হয় কারণ একাধিকবার তাদের পার্শ্ব-প্রতিক্রিয়া সম্পাদন করার ক্ষেত্রে কেবল একবার কার্যকর করার মতো একই প্রভাব রয়েছে। আপনি "আইডেম্পোটেন্সি মানে f∘f = f" বলছেন , তবে প্রোগ্রামিংয়ে আমাদের অর্থ "মৃত্যুদন্ড কার্যকর করার fক্ষেত্রে একই প্রভাব রয়েছে f; f"। মনে রাখবেন যে আপনি একটি "ওয়ার্ল্ড" প্যারামিটার যুক্ত করে দ্বিতীয়টির অর্থ সহজেই প্রাক্তনে রূপান্তর করতে পারেন।
জার্গ ডব্লু মিটাগ

23
@ নীল "আইডেম্পোটেন্সি কঠোরভাবে একটি গাণিতিক শব্দ" " না এটি নয়, এটি নেটওয়ার্কিং এবং ক্লায়েন্ট সার্ভার যোগাযোগ / বিতরণ সিস্টেমেও ব্যবহৃত হয় এবং এটি জার্গডব্লিউমিট্যাগ বর্ণনা করে বলে বর্ণনা করা হয়। এটি একটি কার্যকর ধারণা কারণ এটি একই বার্তা / বার্তা সহ কোনও সার্ভার / ক্লায়েন্টকে একাধিক অনুরোধের মঞ্জুরি দেয় যা সেই আসল বার্তাটি কী সেট করে তা পরিবর্তন করে। আপনার যখন অবিশ্বাস্য যোগাযোগ থাকে তখন এটি কার্যকর হয় এবং আপনাকে একটি কমান্ড পুনরায় চেষ্টা করতে হবে কারণ হয় ক্লায়েন্টের বার্তাটি ফেলে দেওয়া হয়েছিল বা সার্ভারের উত্তর ছিল।
আফপা

7
খাঁটি এবং আদর্শবান্ধব মধ্যে পার্থক্য সম্পর্কে আপনার আরও বিশদে যাওয়া উচিত। আপনার উদাহরণ func1 আদর্শবান নয় কারণ func1(1) != func1(func1(1))
তেজরা

5
বিশুদ্ধতা এবং আদর্শশক্তি আলাদা। একটি খাঁটি ফাংশন গাণিতিক অর্থে আদর্শবান হতে হবে না (পার্শ্ব-প্রতিক্রিয়া হিসাবে এটি স্পষ্টতই আদর্শবান, কারণ এটির কোনওটি নেই)। আইডেম্পোটেন্ট (প্রোগ্রামিং অর্থে) ফাংশনটি খাঁটি হতে হবে না, যেমন ওপির দেওয়া উদাহরণ হিসাবে। এছাড়াও, ওপা হিসাবে যেমন উল্লেখ করা হয়েছে, আদর্শশক্তি বিশুদ্ধতার চেয়ে কঠোরভাবে পৃথক ব্যবহার সহ একটি দরকারী সম্পত্তি। "আদর্শবান এবং কোনও পার্শ্ব-প্রতিক্রিয়া ছাড়াই" হিসাবে আপনার শুদ্ধতার সংজ্ঞাটি ভুল বা কমপক্ষে বিভ্রান্তিকর, ডাউনভোটিং is
ফ্রেক্স

5
প্রোগ্রামিংয়ের প্রসঙ্গে, কোনও "পার্শ্ব প্রতিক্রিয়া" নেই, তবে এটি অন্তর্ভুক্ত করার জন্য যদি আপনি সংজ্ঞাটি প্রসারিত করতে চান তবে একটি আদর্শশক্তি এবং একটি খাঁটি ফাংশন একই জিনিসটিকে বোঝায়। না, তারা মোটেই একই জিনিস বোঝাতে চাইবে না। Idempotent খাঁটি না: void f(int var) { someGlobalVariable = var; }। বিশুদ্ধ, idempotent না: int func1(int var) { return var + 1; }
JLRishe

6

শব্দটি হ'ল Idempotence । নীচে নোট করুন যে একটি আইডেম্পোটেন্ট ফাংশন (নিজের উপর পুনরাবৃত্তভাবে বলা হয়; দ্বিতীয় কোড ব্লক এবং গাণিতিক সংজ্ঞা), এবং ক্রিয়ামূলক আদর্শবদ্ধতা (একই ইনপুটটি ধারাবাহিকভাবে বারবার বলা হয়; প্রথম কোড ব্লক এবং প্রায়শই প্রোগ্রামিং বলতে বোঝানো শব্দ)।

পার্শ্ব প্রতিক্রিয়া সহ একটি ফাংশন চ ক্রমিক রচনা অধীনে আদর্শবানী বলা হয়; f যদি একই যুক্তির তালিকার সাথে দু'বার ফোন করা হয়, দ্বিতীয় কলটির কোনও পার্শ্ব প্রতিক্রিয়া নেই এবং প্রথম কলের মতো একই মান ফিরে আসে [উদ্ধৃতি আবশ্যক] (ধরে নেওয়া প্রথম কল এবং প্রারম্ভের মধ্যে অন্য কোনও পদ্ধতি কল করা হয়নি) দ্বিতীয় কল)।

উদাহরণস্বরূপ, নিম্নলিখিত পাইথন কোডটি বিবেচনা করুন:

x = 0

def setx(n):
    global x
    x = n

setx(5)
setx(5)

এখানে, সেটেক্স আদর্শদর্শী কারণ সেটেক্সে দ্বিতীয় কল (একই যুক্তি সহ) দৃশ্যমান প্রোগ্রামের স্থিতিটি পরিবর্তন করে না: এক্স প্রথম কলটিতে ইতিমধ্যে 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
আদর্শবাদী ফাংশনটি কীভাবে ভিজ্যুয়ালাইজ করা যায় (গাণিতিকভাবে, এবং বিশেষত ভেক্টর জ্যামিতি / লিনিয়ার বীজগণিত ক্ষেত্রে) এটি একটি দুর্দান্ত কংক্রিটের উদাহরণ। যদিও সফ্টওয়্যার ফাংশনটির "আইডেম্পোটেন্স" সত্যই কাছের ধারণা, তবে আমি মনে করি না যে বিকাশকারী / কম্পিউটার বিজ্ঞানী প্রায়শই এই প্রসঙ্গে "প্রজেকশন" শব্দটি ব্যবহার করেন (সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের একটি "প্রজেকশন ফাংশন" বরং কোনও ফাংশনকে বোঝায় যা কোনও বস্তু গ্রহণ করে এবং এটি থেকে উত্পন্ন একটি নতুন অবজেক্ট, বা object বস্তুর একটি সম্পত্তি যেমন উদাহরণস্বরূপ) প্রদান করে
প্যাক ০

2
@ প্যাক ০ ওহ, ঠিক আছে। আমি বিজ্ঞান এবং প্রোগ্রামিংয়ের মধ্যবর্তী অংশে কাজ করি এবং বুঝতে পারি না যে শব্দটি ইতিমধ্যে অত্যধিক বোঝা হয়ে গেছে। আমি এই পরিভাষাটি যেখানে ব্যবহার করব সেখানে এমন কয়েকটি স্বচ্ছল উদাহরণের কথা ভাবতে পারি, তবে আমি স্বীকার করে এমন লোকদের সাথে কাজ করি যারা দৈনিক :
ঝাঁকুনির সাথে সামঞ্জস্য

3

এটি একটি নির্ধারিত অ্যালগরিদম কারণ একই ইনপুট দেওয়া (এই ক্ষেত্রে কোনও ইনপুট নেই), এটি সর্বদা একই আউটপুট উত্পাদন করে।

কম্পিউটার বিজ্ঞানে, একটি ডিস্ট্রিমেন্টিক অ্যালগরিদম হল একটি অ্যালগরিদম যা একটি নির্দিষ্ট ইনপুট দেওয়া হয়, সর্বদা একই আউটপুট উত্পাদন করে, অন্তর্নিহিত মেশিন সর্বদা একই ক্রমের মধ্য দিয়ে যায়। নির্ধারিত অ্যালগরিদমগুলি এখন পর্যন্ত সবচেয়ে অধ্যয়নকৃত এবং পরিচিত ধরণের অ্যালগরিদম, সেইসাথে সবচেয়ে ব্যবহারিক একটি, কারণ এগুলি দক্ষতার সাথে বাস্তব মেশিনে চালানো যেতে পারে।

এসকিউএল ডাটাবেসগুলি নির্ধারক কার্যক্রমে আগ্রহী ।

একটি নির্জ্ঞানী ফাংশন সর্বদা একই উত্তর দেয় যখন তার একই ইনপুট থাকে। এসকিউএলাইটে সর্বাধিক অন্তর্নির্মিত এসকিউএল ফাংশনগুলি হ্রাসকারী minist উদাহরণস্বরূপ, অ্যাবস (এক্স) ফাংশন যতক্ষণ না তার ইনপুট এক্স সমান থাকে ততক্ষণ একই উত্তর প্রদান করে।

কোনও ফাংশন অবশ্যই নির্ধারিত হতে হবে যদি এটি কোনও সূচক গণনায় ব্যবহৃত হয়।

উদাহরণস্বরূপ, SQLite, নিম্নলিখিত অ নির্ণায়ক ফাংশন একটি সূচক ব্যবহার করা যাবে না: random(), changes(), last_insert_rowid()এবং sqlite3_version()


6
প্রশ্নকর্তা func2নির্বিচারবাদী (এর সাথে জড়িত কোনও এলোমেলো প্রভাব নেই) তবে ইতিমধ্যে ঘোষিত সম্পত্তিটি লঙ্ঘন হিসাবে ঘোষণা করেছেন।
ড্রাকো 18

একই ফলাফল পুনরাবৃত্তির দ্বারা উত্পাদিত হয় একই কথা বলার মতো নয় যা নীড় বা শিকল দ্বারা উত্পাদিত হয়। নির্ধারণী কার্যাদি ক্যাচিং ফলাফলের জন্য গুরুত্বপূর্ণ, ততোধিক / হ্যাশিংয়ের চেয়ে বেশি।
mckenzm

3

অন্যান্য উত্তরের পাশাপাশি, যদি এই সম্পত্তি থাকা ফান্টটনের একটি নির্দিষ্ট ইনপুট থাকে তবে এটি একটি নির্দিষ্ট বিন্দু , অবিচ্ছিন্ন বিন্দু বা ফাংশনের ফিক্সপয়েন্ট । উদাহরণস্বরূপ, যে কোনও পাওয়ারের 1 এর সমান 1, সুতরাং (1ⁿ) ⁿ = 1ⁿ = 1।

আউটপুট হিসাবে নিজেকে উত্সাহিত করে এমন একটি প্রোগ্রামের বিশেষ কেস ।


ক্যান্টার সেটগুলি গণিতে :-) হিসাবে কুইনগুলি সফ্টওয়্যারটিতে রয়েছে। এবং অবশ্যই কুইন আদর্শবান নয় - ফলাফল হয় যদি ইতিমধ্যে আউটপুট উপস্থিত থাকে বা তারা পূর্ববর্তী ফলাফল "ক্লোবার" করে এবং একটি নতুন, যদিও অভিন্ন আউটপুট লিখবে write
কার্ল উইথথফট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.