লুপ আক্রমণকারী কী?


268

আমি সিএলআরএস দ্বারা "অ্যালগরিদমের পরিচিতি" পড়ছি। দ্বিতীয় অধ্যায়ে, লেখকরা "লুপ আক্রমণকারীদের" উল্লেখ করেছেন। লুপ আক্রমণকারী কী?


4
এটি ব্যাখ্যা করতে বেশ ভাল লাগছে
টম গ্লেন

এই লিঙ্কটি পরীক্ষা করে দেখুন প্রোগ্রামারস.স্ট্যাকেক্সচেঞ্জ
আদিল আব্বাসি

ঠিক যদি কেউ লুপ ইনগ্রায়েন্টের ধারণার ভিত্তিতে কোনও আসল অ্যালগরিদমিক কোডিং সমস্যা সমাধান করতে চায় তবে হ্যাকারর্যাঙ্কে এই সমস্যাটি দেখুন। তারা কেবল ধারণাটি বিস্তারিতভাবে সন্নিবেশ বাছাইয়ের সমস্যাটিকেও উল্লেখ করেছেন।
আরবিটি

তাত্ত্বিক বোঝার জন্য কেউ এখানে নোটগুলিও উল্লেখ করতে পারেন।
আরবিটি

উত্তর:


345

সরল কথায়, একটি লুপ আক্রমণকারী হ'ল কিছু প্রাকটিক (শর্ত) যা লুপটির প্রতিটি পুনরাবৃত্তির জন্য ধারণ করে। উদাহরণস্বরূপ, আসুন একটি সাধারণ forলুপটি দেখুন যা দেখে মনে হচ্ছে:

int j = 9;
for(int i=0; i<10; i++)  
  j--;

এই উদাহরণে এটি সত্য (প্রতিটি পুনরাবৃত্তির জন্য) যা সত্য i + j == 9। একটি দুর্বল আক্রমণকারী এটি সত্য i >= 0 && i <= 10


29
এটি একটি দুর্দান্ত উদাহরণ। অনেক সময় যখন আমি একজন প্রশিক্ষক শুনেছি যে লুপের আক্রমণকারীটি বর্ণনা করছে, তখন এটি কেবল 'লুপের অবস্থা' বা এর মতোই কিছু হয়েছিল। আপনার উদাহরণ দেখায় যে আক্রমণকারী আরও অনেক কিছু হতে পারে।
ব্রায়ান এস

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

5
হ্যাঁ, এই উদাহরণটি ভুল নয়, তবে যথেষ্ট নয়। আমি @ ক্ল্যাশ আপ ফিরে এসেছি, যেহেতু লুপের আক্রমণকারীটি কেবল নিজের জন্য নয়, লক্ষ্যটি উপস্থাপন করে।
জ্যাক

7
@ টমাস পেট্রিসেক - যখন লুপটি শেষ হয়, i = 10 এবং j = -1; সুতরাং আপনার দেওয়া দুর্বল আক্রমণাত্মক উদাহরণটি সঠিক (?)
রাজা

7
যদিও আমি উপরের মন্তব্যে একমত, আমি এই উত্তরটিকে অগ্রাহ্য করেছি কারণ ... লক্ষ্যটি এখানে সংজ্ঞায়িত করা হয়নি। যে কোনও গোলটি খাপ খায় তার সংজ্ঞা দিন এবং উদাহরণটি দুর্দান্ত।
ফ্ল্যাভিয়াস

119

আমি এই খুব সহজ সংজ্ঞা পছন্দ: ( উত্স )

একটি লুপ আক্রমণকারী হ'ল একটি শর্ত [প্রোগ্রাম ভেরিয়েবলগুলির মধ্যে] যা লুপের প্রতিটি পুনরাবৃত্তির আগে এবং অবিলম্বে তাত্ক্ষণিকভাবে সত্য। (দ্রষ্টব্য যে এটি পুনরাবৃত্তির মাধ্যমে এর সত্য বা মিথ্যা অংশের অংশ সম্পর্কে কিছুই বলে না))

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

এমনকি আরও সাধারণ উদাহরণ: লুপগুলি ইনগ্রেন্টস, সঠিকতা এবং প্রোগ্রাম ডেরাইভেশন

আমি লুপের আক্রমণকারীটিকে যেভাবে বুঝি তা হ'ল প্রোগ্রামগুলি সম্পর্কিত যুক্তিযুক্ত, আনুষ্ঠানিক সরঞ্জাম tool আমরা একটি একক বিবৃতি দিই যা আমরা সত্য প্রমাণের দিকে মনোনিবেশ করি এবং আমরা এটিকে লুপ ইনগ্রায়েন্ট বলি। এটি আমাদের যুক্তি সংগঠিত করে। যদিও আমরা কিছু অ্যালগরিদমের সঠিকতা সম্পর্কে অনানুষ্ঠানিকভাবে তর্ক করতে পারি, একটি লুপ আক্রমণকারী আমাদের ব্যবহার করে খুব মনোযোগ সহকারে চিন্তা করতে এবং আমাদের যুক্তিটি বায়ুচলাচল নিশ্চিত করে।


10
এটি চিহ্নিত করা উচিত যে "প্রতিটি পুনরাবৃত্তির অবিলম্বে" লুপটি সমাপ্ত হওয়ার পরে অন্তর্ভুক্ত থাকে - এটি কীভাবে সমাপ্ত হয় তা নির্বিশেষে।
রবার্ট এস বার্নেস

এই উত্তরের জন্য অনেক ধন্যবাদ! এ থেকে সবচেয়ে বড় গ্রহণটি হ'ল এই লুপের আক্রমণকারীটির উদ্দেশ্য হ'ল অ্যালগরিদমের যথার্থতা প্রমাণ করতে সহায়তা করা। অন্যান্য উত্তরগুলিতে কেবলমাত্র লুপের আক্রমণকারী কী তা ফোকাস করে!
নীকি

39

লুপ এবং আক্রমণকারীদের সাথে লেনদেন করার সময় একটি জিনিস এখনই টের পাওয়া যায় না। তারা লুপ আক্রমণকারী এবং লুপ শর্তাধীন (লুপের সমাপ্তি নিয়ন্ত্রণ করে এমন শর্ত) এর মধ্যে বিভ্রান্ত হয়।

লোকেদের নির্দেশ হিসাবে, লুপের আক্রমণকারীটি অবশ্যই সত্য

  1. লুপটি শুরু হওয়ার আগে
  2. লুপ প্রতিটি পুনরাবৃত্তি আগে
  3. লুপ শেষ হওয়ার পরে

(যদিও এটি লুপের শরীরে অস্থায়ীভাবে মিথ্যা হতে পারে)। অন্যদিকে লুপটি শর্তসাপেক্ষে লুপটি সমাপ্ত হওয়ার পরে অবশ্যই মিথ্যা হওয়া উচিত , অন্যথায় লুপটি কখনই শেষ হবে না।

সুতরাং লুপ আক্রমণকারী এবং লুপ শর্তযুক্ত আলাদা শর্ত হতে হবে

জটিল লুপের আক্রমণকারীটির একটি ভাল উদাহরণ বাইনারি অনুসন্ধানের জন্য।

bsearch(type A[], type a) {
start = 1, end = length(A)

    while ( start <= end ) {
        mid = floor(start + end / 2)

        if ( A[mid] == a ) return mid
        if ( A[mid] > a ) end = mid - 1
        if ( A[mid] < a ) start = mid + 1

    }
    return -1

}

সুতরাং লুপ শর্তসাপেক্ষে বেশ সোজা এগিয়ে মনে হয় - যখন শুরু হয়> লুপটি সমাপ্ত হয়। তবে লুপটি সঠিক কেন? লুপ আক্রমণকারীটি কী যা এটি সঠিকতা প্রমাণ করে?

আক্রমণকারী হ'ল যৌক্তিক বিবৃতি:

if ( A[mid] == a ) then ( start <= mid <= end )

এই বিবৃতিটি একটি যৌক্তিক টোটোলজি - আমরা যে নির্দিষ্ট লুপ / ​​অ্যালগরিদমকে প্রমাণ করার চেষ্টা করছি তার প্রসঙ্গে এটি সর্বদা সত্য । এবং এটি শেষ হওয়ার পরে লুপটির সঠিকতা সম্পর্কে দরকারী তথ্য সরবরাহ করে।

যদি আমরা ফিরে আসি কারণ আমরা অ্যারেতে উপাদানটি পেয়েছি তবে বিবৃতিটি স্পষ্টভাবে সত্য, যেহেতু যদি A[mid] == aতখন aঅ্যারেতে থাকে এবং midঅবশ্যই শুরু এবং শেষের মধ্যে হয়। যদি লুপ বন্ধ কারণ start > endতারপর কোন সংখ্যা হতে পারে যেমন যে start <= mid এবং mid <= end এবং এর ফলে আমরা জানি যে বিবৃতি A[mid] == aমিথ্যা হতে হবে। তবে, ফলস্বরূপ সামগ্রিক যৌক্তিক বিবৃতিটি নাল অর্থে এখনও সত্য। (যুক্তিতে যুক্তিটি যদি (মিথ্যা) থাকে তবে (কিছু) সর্বদা সত্য)

এখন লুপটি বন্ধ হয়ে যাওয়ার সাথে সাথে লুপটি শর্তসাপেক্ষে মিথ্যা হওয়ার বিষয়ে কী বলেছিলাম? দেখে মনে হচ্ছে যখন উপাদানটি অ্যারেতে পাওয়া যায় তখন লুপটি বন্ধ হয়ে গেলে লুপ শর্তযুক্ত হয় !? এটি আসলে নয়, কারণ while ( A[mid] != a && start <= end )প্রকৃত লুপ শর্তসাপেক্ষ সত্যই তবে প্রথম অংশটি বোঝানো হওয়ায় আমরা প্রকৃত পরীক্ষাটি ছোট করে রেখেছি। লুপটি কীভাবে শেষ হয় তা নির্বিশেষে লুপের পরে এই শর্তসাপেক্ষ স্পষ্টভাবে মিথ্যা।


লুপ ইনগ্রেন্ট হিসাবে যৌক্তিক বিবৃতিটি ব্যবহার করা বাঞ্ছনীয়, কারণ সমস্ত যৌক্তিক বিবৃতি সর্বদা সত্য হতে পারে, এটি কোনও শর্ত নয়।
আকর্ষক

আমার এতটা বিস্ময়কর নয়, যেহেতু এখানে aউপস্থিত কোনও গ্যারান্টি নেই A। অনানুষ্ঠানিকভাবে এটি হবে, "যদি কী aঅ্যারেতে উপস্থিত থাকে তবে অবশ্যই এটি অবশ্যই অন্তর্ভুক্ত startএবং endঅন্তর্ভুক্ত হবে"। তারপরে এটি অনুসরণ করে যে A[start..end]খালি থাকলে, এটি a
তে

33

পূর্ববর্তী উত্তরগুলি খুব ভাল উপায়ে লুপের আক্রমণকারীকে সংজ্ঞায়িত করেছে।

নীচে সিএলআরএস এর লেখকরা কীভাবে সন্নিবেশ বাছাইয়ের সঠিকতা প্রমাণ করতে লুপ ইনগ্রায়েন্ট ব্যবহার করেছেন ?

সন্নিবেশ বাছাই অ্যালগরিদম (বই হিসাবে দেওয়া হয়েছে):

INSERTION-SORT(A)
    for j ← 2 to length[A]
        do key ← A[j]
        // Insert A[j] into the sorted sequence A[1..j-1].
        i ← j - 1
        while i > 0 and A[i] > key
            do A[i + 1] ← A[i]
            i ← i - 1
        A[i + 1] ← key

এই ক্ষেত্রে লুপ ইনগ্রায়েন্ট: সাব-অ্যারে [1 থেকে জে -1] সর্বদা বাছাই করা হয়।

এখন এটি পরীক্ষা করে দেখা যাক যে অ্যালগরিদমটি সঠিক।

সূচনা : প্রথম পুনরাবৃত্তির আগে j = 2। সুতরাং সাব-অ্যারে [1: 1] টি অ্যারে পরীক্ষা করা হবে। এটির যেমন একটি মাত্র উপাদান থাকে তাই এটি বাছাই করা হয়। এভাবে আক্রমণকারী সন্তুষ্ট হয়।

রক্ষণাবেক্ষণ : প্রতিটি পুনরাবৃত্তির পরে আক্রমণকারীটি পরীক্ষা করে এটি সহজে যাচাই করা যেতে পারে। এক্ষেত্রে এটি সন্তুষ্ট।

সমাপ্তি : এটি সেই পদক্ষেপ যেখানে আমরা অ্যালগরিদমের যথার্থতা প্রমাণ করব।

যখন লুপটি সমাপ্ত হয় তখন j = n + 1 এর মান। আবার লুপ আক্রমণকারী সন্তুষ্ট। এর অর্থ হল সাব-অ্যারে [1 থেকে n] বাছাই করা উচিত।

এটিই আমরা আমাদের অ্যালগরিদমটি করতে চাই। সুতরাং আমাদের অ্যালগরিদম সঠিক।


1
একমত ... সমাপ্তির বিবৃতিটি এখানে এত গুরুত্বপূর্ণ।
গৌরব আরাধ্যে

18

সমস্ত উত্তরের উত্তরের পাশাপাশি, আমি জেফ এডমন্ডসের দ্বারা কীভাবে আলগোরিদিম সম্পর্কে চিন্তাভাবনা করতে পারি তার একটি দুর্দান্ত উদাহরণ অনুমান করি যে ধারণাটি খুব ভালভাবে ফুটিয়ে তুলতে পারে:

উদাহরণ ১.২.১ "ফাইন্ড-ম্যাক্স টু-ফিঙ্গার অ্যালগরিদম"

1) বিশেষ উল্লেখ: একটি ইনপুট উদাহরণ এলিমেন্টের এল (1..n) নিয়ে গঠিত consists আউটপুটটিতে এমন একটি সূচক থাকে যা এল (i) এর সর্বাধিক মান থাকে। যদি এই একই মান সহ একাধিক এন্ট্রি থাকে, তবে তাদের মধ্যে যে কোনও একটি ফেরত দেওয়া হবে।

2) বেসিক পদক্ষেপ: আপনি দুটি আঙুলের পদ্ধতিতে সিদ্ধান্ত নিন। আপনার ডান আঙুলটি তালিকার নীচে চলেছে।

3) অগ্রগতির পরিমাপ: অগ্রগতির পরিমাপটি আপনার ডান আঙুলের তালিকার কতটা ওপরে রয়েছে is

4) লুপ আক্রমণকারী: লুপের আক্রমণকারীটি জানিয়েছে যে আপনার বাম আঙুলটি আপনার ডান আঙুলের দ্বারা এখন পর্যন্ত মুখোমুখি হওয়া বৃহত্তম এন্ট্রিগুলির মধ্যে একটিকে নির্দেশ করে।

৫) প্রধান পদক্ষেপ: প্রতিটি পুনরাবৃত্তি, আপনি আপনার ডান আঙুলটি তালিকার একটি প্রবেশিকায় নীচে সরান। যদি আপনার ডান আঙুলটি এখন কোনও এন্ট্রির দিকে ইঙ্গিত করে যা বড় হয় তবে বাম আঙুলের প্রবেশটি, তারপরে আপনার বাম আঙুলটি আপনার ডান আঙুলের সাথে রাখতে সরান।

6) অগ্রগতি করুন: আপনি অগ্রগতি করছেন কারণ আপনার ডান আঙুলটি একটি প্রবেশ করায়।

7) লুপ আক্রমণকারী বজায় রাখুন: আপনি জানেন যে লুপের আক্রমণকারীটি নিম্নরূপে বজায় রাখা হয়েছে। প্রতিটি পদক্ষেপের জন্য, নতুন বাম আঙুলের উপাদানটি সর্বোচ্চ (পুরানো বাম আঙুলের উপাদান, নতুন উপাদান)। লুপ আক্রমণকারী দ্বারা, এটি সর্বোচ্চ (সর্বাধিক সংক্ষিপ্ত তালিকা), নতুন উপাদান)। গাণিতিকভাবে - ম্যাটিক্যালি, এটি সর্বোচ্চ (দীর্ঘ তালিকা) list

8) লুপ আক্রমণকারী স্থাপন: স্থাপন আপনি প্রথম দিকে উভয় আঙ্গুলকে প্রথম উপাদানটিতে নির্দেশ করে লুপের আক্রমণকারীটি স্থাপন করেন।

9) প্রস্থান শর্ত: আপনার ডান আঙুলটি তালিকাটি অনুসরণ করা শেষ হলে আপনি সম্পন্ন হন।

10) সমাপ্তি: শেষ পর্যন্ত, আমরা জানি যে সমস্যাটি নিম্নরূপে সমাধান করা হয়েছে। প্রস্থান প্রস্থান অনুসারে, আপনার ডান আঙুলটি সমস্ত প্রবেশের মুখোমুখি হয়েছে। লুপ আক্রমণকারী দ্বারা, আপনার বাম আঙুলটি এর সর্বাধিক পয়েন্ট করে। এই এন্ট্রি ফিরে।

11) সমাপ্তি এবং চলমান সময়: প্রয়োজনীয় সময়টি তালিকার দৈর্ঘ্যের কিছু ধ্রুবক বার।

12) বিশেষ কেস: যখন একই মান সহ একাধিক এন্ট্রি থাকে বা এন = 0 বা এন = 1 হয় তখন কী হয় তা পরীক্ষা করে দেখুন।

13) কোডিং এবং বাস্তবায়নের বিশদ: ...

14) আনুষ্ঠানিক প্রমাণ: অ্যালগরিদমের যথার্থতা উপরের পদক্ষেপগুলি থেকে অনুসরণ করে।


আমি মনে করি এই উত্তরটি আসলে একজন আক্রমনকারীের স্বজ্ঞাত গ্লাসের "আঙ্গুল দেয়" :)।
স্ক্যানি

6

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


5

এই ক্ষেত্রে আক্রমণকারী মানে এমন একটি শর্ত যা প্রতিটি লুপ পুনরাবৃত্তির একটি নির্দিষ্ট সময়ে সত্য হওয়া উচিত।

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


4

আক্রমণকারী অর্থ কখনই পরিবর্তন হয় না

এখানে লুপ আক্রমণের অর্থ "লুপের পরিবর্তনশীল যা ঘটে (বৃদ্ধি বা হ্রাস) লুপের শর্তটি পরিবর্তন করে না অর্থাৎ শর্তটি সন্তুষ্ট হয়" যাতে লুপের আক্রমণকারী ধারণাটি এসেছে


2

লুপ ইনভেরেন্ট সম্পত্তি হ'ল একটি শর্ত যা লুপের কার্যকরকরণের প্রতিটি ধাপকে ধরে রাখে (যেমন লুপগুলির জন্য, যখন লুপগুলি ইত্যাদি) holds

এটি একটি লুপ ইনভেরিয়েন্ট প্রুফের জন্য প্রয়োজনীয়, যেখানে কেউ এটি দেখাতে সক্ষম হয় যে যদি একটি আলগোরিদম সঠিকভাবে কার্যকর করে তবে যদি তার কার্য সম্পাদনের প্রতিটি পদক্ষেপে এই লুপের অদম্য সম্পত্তি থাকে।

অ্যালগরিদমটি সঠিক হওয়ার জন্য, লুপ ইনভায়রেন্ট অবশ্যই ধরে রাখতে হবে:

সূচনা (সূচনা)

রক্ষণাবেক্ষণ (প্রতিটি পদক্ষেপের পরে)

সমাপ্তি (এটি শেষ হয়ে গেলে)

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

সুতরাং, লুপ আক্রমণকারী সম্পত্তি হ'ল পথটির কমপক্ষে ওজন রয়েছে। শুরুতে আমরা কোনও প্রান্ত যোগ করি নি, সুতরাং এই সম্পত্তিটি সত্য (এটি মিথ্যা নয়, এক্ষেত্রে )। এ প্রতিটি পদক্ষেপ , আমরা সর্বনিম্ন ওজন প্রান্ত (লোভী পদক্ষেপ) অনুসরণ, তাই আবার আমরা সর্বনিম্ন ওজন পথ গ্রহণ করছেন। এ শেষ , আমরা আমাদের সম্পত্তি সত্য সর্বনিম্ন ভরযুক্ত পথ খুঁজে পেয়েছি।

যদি একটি অ্যালগরিদম এটি না করে তবে আমরা প্রমাণ করতে পারি যে এটি অনুকূল নয়।


1

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

... // লুপ পরিবর্তিত এখানে অবশ্যই সঠিক হতে হবে
যখন (টেস্ট শর্ত) {
// লুপ উপরের
...
// লুপ নীচে
// লুপ পরিবর্তিত এখানে অবশ্যই সঠিক হতে হবে
}
// সমাপন + + লুপ পরিবর্তিত = লক্ষ্য
...
লুপটির শীর্ষ এবং নীচের মাঝে অগ্রভাগটি সম্ভবত লুপের লক্ষ্যে পৌঁছানোর দিকে তৈরি করা হচ্ছে। এটি আক্রমণকারীকে বিরক্ত করতে পারে (মিথ্যা করতে পারে)। লুপ আক্রমণকারীদের পয়েন্ট হ'ল প্রতিশ্রুতি যে প্রতিবার লুপ বডিটি পুনরাবৃত্তি করার আগে আক্রমণকারী পুনরুদ্ধার করা হবে। এর দুটি সুবিধা রয়েছে:

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

লুপ আক্রমণকারী তৈরি করা উচিত যাতে যখন সমাপ্তির শর্তটি হয় এবং আক্রমণকারীটি সত্য হয়, তবে লক্ষ্যটি পৌঁছে যায়:

আক্রমণকারী + সমাপ্তি => লক্ষ্য
এটি এমন সহজলভ্য এবং সম্পর্কিত যেগুলি সমাপ্তি ব্যতীত সমস্ত লক্ষ্য অর্জন অর্জন করে inv লুপ আক্রমণকারীদের প্রকাশ করার জন্য গাণিতিক চিহ্নগুলি ব্যবহার করা ভাল তবে এটি যখন জটিল পরিস্থিতিগুলির দিকে নিয়ে যায় আমরা স্পষ্ট গদ্য এবং সাধারণ জ্ঞানের উপর নির্ভর করি।


1

দুঃখিত, আমি মন্তব্য অনুমতি নেই।

@ টমাস পেট্রিসেক যেমন আপনি উল্লেখ করেছেন

দুর্বল আক্রমণকারী যা সত্য তা হ'ল i> = 0 && i <10 (কারণ এটি ধারাবাহিকতা শর্ত!) "

এটি কেমন লুপ আক্রমণকারী?

আমি আশা করি আমি ভুল নই, যতদূর আমি বুঝতে পেরেছি [1] লুপের আক্রমণকারীটি লুপ (ইনিশিয়ালাইজেশন) এর শুরুতে সত্য হবে, প্রতিটি পুনরুক্তির (রক্ষণাবেক্ষণ) এর আগে এবং পরে এটি সত্য হবে এবং পরে এটিও সত্য হবে লুপের সমাপ্তি (সমাপ্তি) । তবে সর্বশেষ পুনরাবৃত্তির পরে আমি দশে পরিণত হয়েছি i সুতরাং, শর্তটি i> = 0 && i <10 হয়ে যায় এবং লুপটি বন্ধ করে দেয়। এটি লুপ ইনগ্রেন্টের তৃতীয় সম্পত্তি (সমাপ্তি) লঙ্ঘন করে।

[1] http://www.win.tue.nl/~kbuchin/teaching/JBP030/notebooks/loop-invariants.html


আমার অনুমান যে এটি সত্য কারণ লুপটি আসলে এই শর্তগুলির অধীনে কার্যকর হয় না।
মুইইউ

0

লুপ আক্রমণকারী একটি গাণিতিক সূত্র যেমন (x=y+1)। এই উদাহরণে, xএবং yএকটি লুপ দুটি ভেরিয়েবল প্রতিনিধিত্ব করুন। কোডটি কার্যকর করার সময় এই পরিবর্তনশীলগুলির পরিবর্তিত আচরণ বিবেচনা করে, সমস্ত সম্ভাব্য xএবং yমানগুলির পরীক্ষা করা এবং তারা কোনও ত্রুটি উত্পন্ন করে কিনা তা দেখতে প্রায় অসম্ভব । বলুন xএকটি পূর্ণসংখ্যা হয়। পূর্ণসংখ্যা মেমরিতে 32 বিট স্থান ধরে রাখতে পারে। যদি সংখ্যাটি অতিক্রম করে, বাফার ওভারফ্লো ঘটে। সুতরাং আমাদের নিশ্চিত হওয়া দরকার যে কোডটি কার্যকর করার সময় এটি কখনই সেই জায়গার বেশি হয় না। তার জন্য, আমাদের একটি সাধারণ সূত্র বুঝতে হবে যা ভেরিয়েবলের মধ্যে সম্পর্ক প্রদর্শন করে। সর্বোপরি, আমরা কেবল প্রোগ্রামটির আচরণটি বোঝার চেষ্টা করি।


0

সহজ কথায়, এটি একটি লুপ শর্ত যা প্রতিটি লুপ পুনরাবৃত্তিতে সত্য:

for(int i=0; i<10; i++)
{ }

এটিতে আমরা বলতে পারি আমার অবস্থা i<10 and i>=0



-1

লিনিয়ার সন্ধানে (বইয়ে দেওয়া অনুশীলন অনুসারে), প্রদত্ত অ্যারেতে আমাদের V এর সন্ধান করতে হবে।

0 <= k <দৈর্ঘ্য থেকে অ্যারের স্ক্যান করা এবং প্রতিটি উপাদানকে তুলনা করার মতো এটি সহজ। যদি ভি খুঁজে পাওয়া যায় বা স্ক্যানিং যদি অ্যারের দৈর্ঘ্যে পৌঁছায় তবে লুপটি বন্ধ করুন।

উপরের সমস্যায় আমার বোঝা অনুসারে-

লুপ ইনভেরেন্টস (ইনিশিয়ালাইজেশন): কে - 1 পুনরাবৃত্তিতে ভি পাওয়া যায় না। খুব প্রথম পুনরাবৃত্তি, এটি -1 হবে সুতরাং আমরা বলতে পারি ভি -1 পজিশনে পাওয়া যায়নি -1

রক্ষণাবেক্ষণ: পরবর্তী পুনরাবৃত্তিতে, কে -1 এ পাওয়া যায়নি V সত্য

সমাপ্তি: কে পজিশনে ভি ভি পাওয়া গেলে বা কে অ্যারের দৈর্ঘ্যে পৌঁছায়, লুপটি সমাপ্ত করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.