برنامه نویسی

بازگشت: راهنمای مبتدی – انجمن DEV

مفهوم بازگشت در برنامه نویسی جاوا اسکریپت همیشه برای من جذاب، ترسناک و مبهم بوده است. امروز، من اجازه خواهم داد که بخش جذاب من را راهنمایی کند تا با توضیح بازگشت به شما، خواننده من، و همچنین برای خودم دست و پنجه نرم کنم. باشد که هر دوی ما درک کامل تری از زیبایی، پیچیدگی ها و کاربردهای ذاتی این تکنیک برنامه نویسی ساده تا پایان این پست وبلاگ داشته باشیم.

بازگشت چیست؟

قبل از اینکه به «چرا» و «چگونه» برسیم، ممکن است ایده خوبی باشد که با «چی» شروع کنیم. بازگشت در زمینه برنامه نویسی دقیقاً چیست؟ طبق MDN، بازگشت “عمل فراخوانی یک تابع خود” است.

به این مثال ساده توجه کنید:

function infiniteJest() {
    console.log("HA!");
    infiniteJest();
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کارکرد infiniteJest() خود را درون بدن خود می خواند و آن را به یک تابع بازگشتی تبدیل می کند. به نظر شما اگر این تابع را فراخوانی کنیم چه اتفاقی می افتد؟

اگر تماس بگیرید infiniteJest()، “HA!” به کنسول و سپس “HA!” از نو. و سپس دوباره. و دوباره. چاپ “HA!” به کنسول تا پایان زمان، مگر اینکه کسی یا چیزی آن را متوقف کند. این وضعیتی نیست که ما بخواهیم در آن قرار بگیریم، بنابراین چگونه می توانیم عملکرد خود را تغییر دهیم تا از لوپی شدن بی نهایت آن جلوگیری کنیم؟ اگر گفتید “از کیس پایه استفاده کنید” کاملاً درست می گویید! هر تابع بازگشتی به یک حالت پایه نیاز دارد تا بداند چه زمانی باید متوقف شود.

یکی از راه های انجام این کار، دادن است infiniteJest آ counter پارامتر تا بتوانیم به تابع بگوییم که چند بار می خواهیم “HA!” را چاپ کند:

function infiniteJest(counter) {
    if (counter > 0) {
        console.log("HA!");
        infiniteJest(counter - 1);
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

چرا از Recursion استفاده کنیم؟

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

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

function factorial(n) {
    if (n === 0) {
        return 1;
    }
    return n * factorial(n - 1);
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما همچنین می توانیم فاکتوریل ها را با استفاده از a پیدا کنیم for حلقه، اما کد بیشتری می‌گیرد، گیج‌کننده‌تر است و به نظر زیبا نیست. بسیاری از موقعیت‌ها به طور طبیعی خود را به تکنیک‌های بازگشتی می‌دهند، از جمله مشکلاتی که می‌توانند به مشکلات فرعی کوچک‌تر تقسیم شوند، اما بازگشت همیشه بهترین راه‌حل نیست.

خطرات بازگشت

اگر بخواهیم فاکتوریل یک عدد بسیار بزرگ را پیدا کنیم، مثلاً با استفاده از a for حلقه در واقع ترجیح داده می شود. به گفته MDN، اگر از بازگشت استفاده می‌کردیم، خطر سرریز پشته را داشتیم، این خطایی است که زمانی رخ می‌دهد که برنامه ما سعی می‌کند «فضای بیشتری را نسبت به آنچه اختصاص داده شده اشغال کند». این یکی از خطرات بازگشت است. نسبت به روش های تکراری از حافظه بیشتری استفاده می کند و اغلب کندتر است.

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

نتیجه

Recursion یک ابزار قدرتمند در برنامه نویسی است که با استفاده از قابلیت فراخوانی تابع، راه حل های ظریفی را برای بسیاری از مشکلات ارائه می دهد. با درک نحوه استفاده از آن و زمان عدم استفاده از آن، می‌توانیم به طور موثری از خطرات رایج مانند سرریز پشته جلوگیری کنیم. اینکه آیا شما بازگشت یا تکرار را انتخاب می کنید بستگی به مشکل در دست دارد، اما تسلط بر بازگشت درها را به روی حل مسائل پیچیده با وضوح و کارایی باز می کند.

در سفر برنامه نویسی خود، بازگشت را بیشتر کاوش کنید – این فقط یک تکنیک نیست، بلکه یک طرز فکر است که قابلیت های حل مسئله شما را گسترش می دهد.

کاوش بیشتر

اگر شما نیز مانند من مشتاق هستید که درک خود را از بازگشت عمیق تر کنید، موضوعات پیشرفته تری مانند بهینه سازی بازگشت دم، حافظه گذاری، و کاربردهای عملی در الگوریتم هایی مانند پیمایش درخت و برنامه نویسی پویا را بررسی کنید.

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

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

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

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