পুনরাবৃত্তি ফাংশন কলে রিটার্ন বিবৃতি কারণ


14

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

list *search_list(list *l, item_type x) {
  if (l == NULL) return(NULL);
  if (l->item == x)
    return(l);
  else
    return( search_list(l->next, x) );
}

আমি রিটার্ন স্টেটমেন্টের তাত্পর্যটি শেষ পর্যন্ত পেতে পারি না (অর্থাত্ সার্চ_লিস্ট রিটার্ন (l-> পরবর্তী, এক্স))। স্ট্যাক মডেল ব্যবহার করে যদি কেউ এই ধারণাটি ব্যাখ্যা করতে পারে তবে এটি সত্যিই সহায়ক হবে।


তালিকার প্রথম পদটি যদি ফলাফল না হয় তবে তালিকাটির বাকী অংশটি অনুসন্ধান করুন । সর্বশেষ এটিই returnকরে।
জর্জিও

@ জর্জিও, কেন কেবল কোনও ফাংশন কলই যথেষ্ট হবে না, কেন তার আগে ফেরতের দরকার পড়ে?
ব্যবহারকারী 1369975

7
কারণ আপনাকে ফাংশনটি দিয়ে ফিরে আসা মানটি ফিরিয়ে দিতে হবে
ইসাইলিজা

7
ডাউনভোটার্স: দয়া করে বুঝতে পারেন যে, ওপিটির পটভূমির উপর নির্ভর করে এটি কী returnকরে তা একেবারেই স্পষ্ট নয়। প্রকৃতপক্ষে, কার্যকরী ভাষায় (এবং কিছু মিশ্র ভাষাগুলি, যেমন স্কালার) return প্রয়োজন হয় না : পুনরাবৃত্ত ফাংশনের মানটি তার শেষ প্রকাশের মান। সোজা search_list(l->next, x)ছাড়া লেখালেখি returnকাজ করত স্কালায়! returnবিবৃতিটির অর্থ কেবলমাত্র অপরিহার্য পটভূমি সহ প্রোগ্রামারদের কাছেই স্পষ্ট।
আন্দ্রেস এফ।

ওপি: আপনার কোড স্নিপেট সিতে লেখা আছে?
আন্দ্রেস এফ।

উত্তর:


19

একটি রিটার্ন বিবৃতি বর্তমান ফাংশনটির কল-ফ্রেমের তাত্ক্ষণিক কলারের কাছে একটি মান ফেরত দেয় । পুনরাবৃত্তির ক্ষেত্রে, এই তাত্ক্ষণিক কলার একই ফাংশনের আর একটি প্রার্থনা হতে পারে।

বেশিরভাগ ভাষায়, আপনি যে ফাংশনটি বলেছিলেন তার পুনরুদ্ধার মানটি ব্যবহার না করে (পুনরাবৃত্তভাবে বা না), যদি ফেরত মানটি বাতিল হয়ে যায় বা এটি একটি নির্ণয়যোগ্য ত্রুটি। কিছু ভাষা রয়েছে যেখানে সর্বশেষ ফাংশন কলের রিটার্ন মান বর্তমান ফাংশন আমন্ত্রণের রিটার্ন মান হিসাবে স্বয়ংক্রিয়ভাবে পুনরায় ব্যবহৃত হয়, তবে এগুলি স্বাভাবিক এবং পুনরাবৃত্ত ফাংশন কলগুলির মধ্যে পার্থক্য করে না।

অব্যবহৃত রিটার্ন মানগুলি নিঃশব্দে ফেলে দেওয়া হবে বলে ধরে নিলে আপনি যদি কোডটি এইভাবে লিখে থাকেন:

list *search_list(list *l, item_type x) {
  if (l == NULL) return(NULL);
  if (l->item == x)
    return(l);
  else
    search_list(l->next, x); // no return!
}

তারপরে search_listকেবলমাত্র একটি খালি তালিকার (NULL) বা প্রথম আইটেমটি আপনি সন্ধান করা মানের সাথে মেলে তবেই একটি সংজ্ঞায়িত মানটি ফিরিয়ে আনবে। ফাংশনটি পুনরাবৃত্ত কলগুলিতে যাওয়ার সাথে সাথে ফলাফল কী হবে তা আপনি জানেন না, কারণ পুনরাবৃত্তির কলটির ফলাফল বাতিল হয়ে যায়।

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


এফডাব্লুআইডাব্লু, পার্ল সর্বশেষ এক্সপ্রেশনটির ফলাফল স্বয়ংক্রিয়ভাবে প্রত্যাবর্তন করে, যার অর্থ আমি মনে করি এটির ফিরে আসার মানটি পুনরায় ব্যবহার হবে। কিন্তু আমি বছরের পর বছর এটি স্পর্শ করি নি, তাই আমি এটি সম্পর্কে নিশ্চিত নই।
ববসন

1

দুটি জিনিস; আপনি যে "এক্স" সন্ধান করছেন তা সেক্ষেত্রে পুরো তালিকাটি ফিরিয়ে দেওয়া পুনরুক্তি ব্যবহারের নিশ্চয়তা দেয় না, তবে সেটিকে বাদ দিয়ে নিম্নলিখিতটি বিবেচনা করুন:

ধরা যাক আপনি এক্স = "ডিসেম্বর" এর মান খুঁজছেন, এবং আপনার তালিকাটি বছরের মাসগুলির সংখ্যাসূচক মান, পরের মাসের পয়েন্টার এবং তালিকার l-> আইটেমগুলির বানানযুক্ত নামগুলি মাস। (জানুয়ারী, ফেব্রুয়ারি, ..., ডিসেম্বর) সম্ভাব্য ফলাফলগুলির জন্য আপনার তিনটি রিটার্ন দরকার। তালিকায় আপনার সন্ধান করা এক্সটি না থাকলে প্রথম, রিটার্ন (NULL) প্রয়োজন needed দ্বিতীয়, (রিটার্ন (l)) তালিকাটি ফিরে আসে, এই ক্ষেত্রে আপনাকে জানাতেই আপনি আপনার "x" খুঁজে পেয়েছেন। শেষটি যেখানে স্ট্যাক মডেলটি খেলতে আসে। ক্রিয়াকলাপের ধারাবাহিক কলগুলিতে স্থানীয় ভেরিয়েবলগুলি (বিশেষত, l-> আইটেমের) আপডেট হত:

1: l->item = January
   returns search_list(l->next, x)
2: l->item = February
   returns search_list(l->next, x)
3-11: March, April, May, June, July, August, September, October, November
   all return search_list(l->next, x)
12: l->item = December
  This matches the second if() and returns your list, letting you know you found your search item.

, আপনার দৃষ্টান্তের জন্য ধন্যবাদ, তবে সত্যই শেষ
রিটার্নটি

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