۱۲ اکتبر ۲۰۲۲

بازگشت و پشته

بیایید برگردیم به تابع‌ها و آن‌ها را عمیق‌تر مطالعه کنیم.

اولین موضوع ما بازگشت (recursion) خواهد بود.

اگر شما در برنامه‌نویسی تازه‌کار نیستید، احتمالا این برای شما آشنا است و می‌توانید این فصل را رد کنید.

بازگشت یک الگوی برنامه‌نویسی است که در مواقعی که یک کار به طور طبیعی می‌تواند به چند کار از نوع یکسان اما ساده‌تر تقسیم شود کاربرد دارد. یا زمانی که کاری می‌تواند به عملی آسان به علاوه‌ی یک نوع ساده‌تر از همان کار ساده‌سازی شود. یا همانطور که به زودی خواهیم دید، برای کنار آمدن با بعضی از ساختارهای داده.

زمانی که یک تابع کاری را انجام می‌دهد، در فرایند آن، تابع می‌تواند تعداد زیادی از تابع‌های دیگر را فرا بخواند. یک مورد جرئی از این موضوع زمانی است که تابع خودش را فراخوانی می‌کند. به این عمل بازگشت (recursion) می‌گویند.

دو طرز فکر

برای اینکه با چیزی ساده شروع کنیم، بیایید بک تابع pow(x, n) بنویسیم که x را به توانی طبیعی از n می‌رساند. به عبارتی دیگر، x را n بار در خودش ضرب می‌کند.

pow(2, 2) = 4
pow(2, 3) = 8
pow(2, 4) = 16

دو راه برای پیاده‌سازی آن وجود دارد.

  1. طرز فکر تکرارشونده: حلقه for:

    function pow(x, n) {
      let result = 1;
    
      // ضرب می‌کند x بار در n را result در حلقه
      for (let i = 0; i < n; i++) {
        result *= x;
      }
    
      return result;
    }
    
    alert( pow(2, 3) ); // 8
  2. طرز فکر بازگشتی: کار را ساده کن و خودت را فراخوانی کن:

    function pow(x, n) {
      if (n == 1) {
        return x;
      } else {
        return x * pow(x, n - 1);
      }
    }
    
    alert( pow(2, 3) ); // 8

لطفا در نظر داشته باشید که نوع بازگشتی از پایه تفاوت دارد.