برنامه نویسی

حل مسئله با استفاده از بازگشت – انجمن DEV

Summarize this content to 400 words in Persian Lang
اگر به صورت بازگشتی فکر می کنید، می توانید بسیاری از مسائل را با استفاده از بازگشت حل کنید. بخش‌های قبلی دو مثال کلاسیک بازگشتی ارائه کردند. همه روش های بازگشتی دارای ویژگی های زیر هستند:

روش با استفاده از یک پیاده سازی شده است اگر دیگری یا الف تعویض بیانیه ای که منجر به موارد مختلفی می شود.
یک یا چند مورد پایه (ساده ترین مورد) برای توقف بازگشت استفاده می شود.
هر فراخوانی بازگشتی مشکل اصلی را کاهش می دهد و آن را به طور فزاینده ای به یک مورد اصلی نزدیک می کند تا زمانی که به آن حالت تبدیل شود.

به طور کلی، برای حل یک مسئله با استفاده از بازگشت، آن را به مسائل فرعی تقسیم می کنید. هر مشکل فرعی مانند مشکل اصلی است اما اندازه آن کوچکتر است. شما می توانید رویکرد مشابهی را برای هر زیرمسئله برای حل آن به صورت بازگشتی اعمال کنید.

بازگشت همه جا هست. سرگرم کننده است بازگشتی فکر کنید. نوشیدن قهوه را در نظر بگیرید. می توانید این روش را به صورت بازگشتی به صورت زیر توصیف کنید:

public static void drinkCoffee(Cup cup) {if (!cup.isEmpty()) {cup.takeOneSip(); // Take one sipdrinkCoffee(cup);}}

فرض فنجان یک شی برای یک فنجان قهوه با روش های نمونه است خالی است() و takeOneSip(). می توانید مشکل را به دو زیرمشکل تقسیم کنید: یکی نوشیدن یک جرعه قهوه و دیگری نوشیدن بقیه قهوه در فنجان. مشکل دوم همان مشکل اصلی است اما از نظر اندازه کوچکتر است. مورد اصلی مشکل زمانی است که لیوان خالی است.

مشکل چاپ پیام را در نظر بگیرید n بار. می‌توانید مشکل را به دو زیرمشکل تقسیم کنید: یکی چاپ پیام یک بار و دیگری چاپ کردن آن n – 1 بار. مشکل دوم مانند مشکل اصلی است اما اندازه آن کوچکتر است. مورد پایه برای مشکل است n == 0. شما می توانید این مشکل را با استفاده از Recursion به صورت زیر حل کنید:

public static void nPrintln(String message, int times) {if (times >= 1) {System.out.println(message);nPrintln(message, times – 1);} // The base case is times == 0}

توجه داشته باشید که فیب متد در بخش قبل یک مقدار را به تماس گیرنده خود برمی گرداند، اما قهوه بنوش و nPrintln روش ها هستند خالی و مقداری را بر نمی گرداند.

اگر شما بازگشتی فکر کنید، می توانید از بازگشت برای حل بسیاری از مسائل ارائه شده در فصل های قبلی این کتاب استفاده کنید. مشکل palindrome را در Palindrome.java در نظر بگیرید. به یاد داشته باشید که یک رشته اگر از سمت چپ و از راست یکسان خوانده شود، یک پالیندروم است. به عنوان مثال، “مامان” و “بابا” پالیندروم هستند، اما “عمو” و “خاله” نیستند. مشکل بررسی اینکه آیا یک رشته یک رشته پالیندروم است یا نه را می توان به دو مشکل فرعی تقسیم کرد:

بررسی کنید که آیا کاراکتر اول و آخرین کاراکتر رشته برابر هستند یا خیر.
دو کاراکتر انتهایی را نادیده بگیرید و بررسی کنید که آیا بقیه رشته فرعی یک palindrome است یا خیر.

دومین مشکل فرعی مشابه مشکل اصلی است اما اندازه کوچکتر دارد. دو حالت پایه وجود دارد: (1) دو کاراکتر انتهایی یکسان نیستند و (2) اندازه رشته 0 یا 1. در مورد 1، رشته یک پالیندروم نیست. در مورد 2، رشته یک پالیندروم است. روش بازگشتی برای این مشکل را می توان مطابق کد زیر پیاده سازی کرد.

این رشته فرعی متد در خط 8 یک رشته جدید ایجاد می کند که همان رشته اصلی است به جز بدون اولین و آخرین کاراکتر. اگر دو کاراکتر انتهایی را بررسی کنید، بررسی اینکه آیا رشته‌ای یک رشته است یا نه برابر است با بررسی اینکه آیا رشته فرعی یک رشته است یا نه.رشته اصلی یکسان است.

اگر به صورت بازگشتی فکر می کنید، می توانید بسیاری از مسائل را با استفاده از بازگشت حل کنید. بخش‌های قبلی دو مثال کلاسیک بازگشتی ارائه کردند. همه روش های بازگشتی دارای ویژگی های زیر هستند:

  • روش با استفاده از یک پیاده سازی شده است اگر دیگری یا الف تعویض بیانیه ای که منجر به موارد مختلفی می شود.
  • یک یا چند مورد پایه (ساده ترین مورد) برای توقف بازگشت استفاده می شود.
  • هر فراخوانی بازگشتی مشکل اصلی را کاهش می دهد و آن را به طور فزاینده ای به یک مورد اصلی نزدیک می کند تا زمانی که به آن حالت تبدیل شود.

به طور کلی، برای حل یک مسئله با استفاده از بازگشت، آن را به مسائل فرعی تقسیم می کنید. هر مشکل فرعی مانند مشکل اصلی است اما اندازه آن کوچکتر است. شما می توانید رویکرد مشابهی را برای هر زیرمسئله برای حل آن به صورت بازگشتی اعمال کنید.

بازگشت همه جا هست. سرگرم کننده است بازگشتی فکر کنید. نوشیدن قهوه را در نظر بگیرید. می توانید این روش را به صورت بازگشتی به صورت زیر توصیف کنید:

public static void drinkCoffee(Cup cup) {
if (!cup.isEmpty()) {
cup.takeOneSip(); // Take one sip
drinkCoffee(cup);
}
}

فرض فنجان یک شی برای یک فنجان قهوه با روش های نمونه است خالی است() و takeOneSip(). می توانید مشکل را به دو زیرمشکل تقسیم کنید: یکی نوشیدن یک جرعه قهوه و دیگری نوشیدن بقیه قهوه در فنجان. مشکل دوم همان مشکل اصلی است اما از نظر اندازه کوچکتر است. مورد اصلی مشکل زمانی است که لیوان خالی است.

مشکل چاپ پیام را در نظر بگیرید n بار. می‌توانید مشکل را به دو زیرمشکل تقسیم کنید: یکی چاپ پیام یک بار و دیگری چاپ کردن آن n – 1 بار. مشکل دوم مانند مشکل اصلی است اما اندازه آن کوچکتر است. مورد پایه برای مشکل است n == 0. شما می توانید این مشکل را با استفاده از Recursion به صورت زیر حل کنید:

public static void nPrintln(String message, int times) {
if (times >= 1) {
System.out.println(message);
nPrintln(message, times - 1);
} // The base case is times == 0
}

توجه داشته باشید که فیب متد در بخش قبل یک مقدار را به تماس گیرنده خود برمی گرداند، اما قهوه بنوش و nPrintln روش ها هستند خالی و مقداری را بر نمی گرداند.

اگر شما بازگشتی فکر کنید، می توانید از بازگشت برای حل بسیاری از مسائل ارائه شده در فصل های قبلی این کتاب استفاده کنید. مشکل palindrome را در Palindrome.java در نظر بگیرید. به یاد داشته باشید که یک رشته اگر از سمت چپ و از راست یکسان خوانده شود، یک پالیندروم است. به عنوان مثال، “مامان” و “بابا” پالیندروم هستند، اما “عمو” و “خاله” نیستند. مشکل بررسی اینکه آیا یک رشته یک رشته پالیندروم است یا نه را می توان به دو مشکل فرعی تقسیم کرد:

  • بررسی کنید که آیا کاراکتر اول و آخرین کاراکتر رشته برابر هستند یا خیر.
  • دو کاراکتر انتهایی را نادیده بگیرید و بررسی کنید که آیا بقیه رشته فرعی یک palindrome است یا خیر.

دومین مشکل فرعی مشابه مشکل اصلی است اما اندازه کوچکتر دارد. دو حالت پایه وجود دارد: (1) دو کاراکتر انتهایی یکسان نیستند و (2) اندازه رشته 0 یا 1. در مورد 1، رشته یک پالیندروم نیست. در مورد 2، رشته یک پالیندروم است. روش بازگشتی برای این مشکل را می توان مطابق کد زیر پیاده سازی کرد.

توضیحات تصویر

این رشته فرعی متد در خط 8 یک رشته جدید ایجاد می کند که همان رشته اصلی است به جز بدون اولین و آخرین کاراکتر. اگر دو کاراکتر انتهایی را بررسی کنید، بررسی اینکه آیا رشته‌ای یک رشته است یا نه برابر است با بررسی اینکه آیا رشته فرعی یک رشته است یا نه.
رشته اصلی یکسان است.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا